我有两个表,staff
和 staff_data
。 staff
是一个普通表,staff_data
是一个 Type/Value 复合主键表(主键是 Staff_ID 和 Type 的组合)——所以数据样本看起来像这个:
+----------+--------------------+----------+
| Staff_ID | Type | Value |
+----------+--------------------+----------+
| 1 | Department | IT |
| 1 | Organisation | BigCorp |
| 821 | Department | Finance |
| 1 | NetworkUsername | smith.j |
+----------+--------------------+----------+
我的目标是查询将选择所有员工及其部门,但是如果他们没有在 staff_data
中列出的部门,它仍会选择他们,但会列出部门为空。
下面的查询只包括在 staff_data
中列出部门的员工
SELECT staff.name, staff_data.Value as Department
FROM staff JOIN staff_data USING(Staff_ID)
WHERE staff_data.Type = ‘Department’
GROUP BY staff.Name
但是如果我不包含 WHERE 子句,显然我得不到我想要的数据。我如何编写一个查询来列出所有员工,包括他们的部门(如果存在)?
使用外连接:
SELECT staff.name, staff_data.Value as Department
FROM staff
LEFT OUTER JOIN staff_data
ON staff.Staff_ID = staff_data.Staff_ID
AND staff_data.Type = "Department"
在左外连接中,如果右表没有与约束匹配的值,则输出仍将包含左表中的行。 (来自右表的列将为空。)
我是一名优秀的程序员,十分优秀!