我有两个表,staff
和staff_data
。 staff
是普通表,staff_data
是类型/值复合主键表(主键是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子句,显然我没有得到我想要的数据。如何编写将列出所有员工的查询,包括他们的部门(如果存在)?
答案 0 :(得分:3)
使用外部联接:
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"
在左外连接中,如果右表没有与约束匹配的值,则输出仍将包含左表中的行。 (来自右表的列将为null。)