SQL查询一对多关系

19
我可以帮助您翻译这段内容。这是一段关于编程的内容,讲述了员工和培训表格之间的关系。员工完成的各种培训班级都记录在培训表格中。我们有强制性的安全意识培训,所以每个员工都必须完成这个培训班级。我正在尝试运行一个查询,返回所有员工是否已经完成了这个培训班级的列表,但是遇到了麻烦。
下面是示例员工表格。
╔════╦══════╗
║ 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

员工缺席“安全意识”课程就会被忽略,从而失去机会。

1
部门编号是否等于员工编号? - Maciej
5个回答

24
使用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)             ║
╚════╩══════╩════════════════════╝

6
非常酷,我不知道我可以在连接中进行筛选。这也将有助于其他领域。 - Rich

1
你正在执行内连接,但你需要的是左外连接。二者的区别在于:内连接只返回与被连接表匹配的结果,而左外连接则会返回主表中的所有结果,无论被连接表是否有匹配的结果。

1

使用左外连接代替JOIN。我还会更改您的WHERE子句为

WHERE training.Id = 1

如果这是等效的。

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

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接