我有一张供员工使用的桌子,还有一张带培训的桌子。“培训”表包含员工已完成的各种培训课程。我们有强制性的安全意识培训,所以每个员工都必须完成这个培训课程。我在运行一个查询时遇到了问题,该查询将返回列出的所有完成培训或未完成培训的员工。
示例Employee表
╔════╦══════╗
║ 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缺少“安全意识”课程的员工根本不会出现,而是掉到了裂缝里。
发布于 2013-03-06 23:50:17
在表的连接过程中使用LEFT JOIN并移动过滤条件(特别是在ON子句中)
另一个问题是使用单引号:' '而不是‘ ’
SELECT employee.id,
employee.name, training.class
FROM employee
LEFT JOIN training
ON employee.id = training.department_id AND
training.class LIKE '%SECURITY%'
ORDER BY employee.id结果
╔════╦══════╦════════════════════╗
║ ID ║ NAME ║ CLASS ║
╠════╬══════╬════════════════════╣
║ 1 ║ Bob ║ Security Awareness ║
║ 2 ║ Tom ║ Security Awareness ║
║ 3 ║ John ║ (null) ║
╚════╩══════╩════════════════════╝发布于 2013-03-06 23:48:26
您正在执行内部连接,您需要的是左外部连接。不同之处在于:内连接仅在连接表中存在匹配的情况下才会产生结果。left outer join将返回主表中的所有结果,而不管连接表中是否有结果。
发布于 2013-03-06 23:50:04
使用左外部连接而不是连接。我还会将WHERE子句改为
WHERE training.Id = 1如果这是等价的
https://stackoverflow.com/questions/15251761
复制相似问题