18

我有一张员工表和另一张培训表。培训表包含员工已完成的各种培训课程。我们有强制性的安全意识培训,所以每个员工都必须完成这个培训课程。我在运行查询时遇到问题,该查询将返回列出的所有员工是否已完成培训。

员工表示例

╔════╦══════╗
║ ID ║ NAME ║
╠════╬══════╣
║  1 ║ Bob  ║
║  2 ║ Tom  ║
║  3 ║ John ║
╚════╩══════╩

示例训练表

╔════╦══════════════╦════════════════════╗
║ ID ║ DEPARTMENT_ID║       CLASS        ║
╠════╬══════════════╬════════════════════╣
║  1 ║           1  ║ Security Awareness ║
║  2 ║           1  ║ Workplace Safety   ║
║  3 ║           2  ║ Security Awareness ║
╚════╩══════════════╩════════════════════╝

目标结果

╔════╦══════╦════════════════════╗
║ ID ║ NAME ║       CLASS        ║
╠════╬══════╬════════════════════╣
║  1 ║ Bob  ║ Security Awareness ║
║  2 ║ Tom  ║ Security Awareness ║
║  3 ║ John ║ (null)             ║
╚════╩══════╩════════════════════╝

我正在使用的查询是

SELECT employee.id, employee.name, training.class
FROM employee
JOIN training ON employee.id = training.department_id
WHERE training.class LIKE '%SECURITY%'
ORDER BY employee_id

错过“安全意识”课程的员工只是没有出现,并且从裂缝中掉了下来。

4

5 回答 5

23
于 2013-03-06T15:50:17.090 回答
1

您正在执行内部联接,您想要的是左外部联接。不同之处在于:内连接只会在连接表中有匹配项的情况下产生。左外连接将返回主表中的所有结果,无论连接表中是否有结果。

于 2013-03-06T15:48:26.453 回答
1

代替 JOIN 使用 LEFT OUTER JOIN。我还将您的 WHERE 子句更改为

WHERE training.Id = 1

如果那是等价的

于 2013-03-06T15:50:04.087 回答
0

您要查找的内容称为外部联接。在这种情况下,您将需要一个左外连接:

SELECT employee.id, employee.name, training.class 
FROM employee LEFT OUTER JOIN training ON employee.id = training.department_id 
WHERE training.class LIKE '%Security%'
ORDER BY employee_id
于 2013-03-06T15:49:00.913 回答
0
Select e.id, e.name, t.class from employee e left outer join training t on e.id = t.department_id where t.class like '%Security%' order by e.id
于 2013-03-06T15:54:27.703 回答