使用自联接
到目前为止,我们使用的联接涉及不同的表。 在某些情况下,你可能需要检索表中的行,并将其与同一表中的其他行进行比较。 例如,在人力资源应用程序中,“Employee”表可能包含有关每个员工的经理的信息,并将经理的 ID 存储在员工所在的那行中。 每个经理也列为一名员工。
EmployeeID
FirstName
ManagerID
1
Dan
Null
2
Aisha
1
3
Rosie
1
4
Naomi
3
要检索员工信息并将其与相关的经理进行匹配,可以在查询中使用该表两次,并将其与自身进行联接以实现查询目的。
SELECT emp.FirstName AS Employee,
mgr.FirstName AS Manager
FROM HR.Employee AS emp
LEFT OUTER JOIN HR.Employee AS mgr
ON emp.ManagerID = mgr.EmployeeID;
在该查询的结果中,每名员工一行,其中包含其经理的姓名。 公司的 CEO 没有经理。 为了在结果中包括 CEO,将使用外部联接,并且对于“ManagerID”字段没有匹配的“EmployeeID”字段的行,经理姓名将返回 NULL。
Employee
Manager
Dan
Null
Aisha
Dan
Rosie
Dan
Naomi
Rosie
在其他情况下,你可能希望将表中的行与同一表中的其他行进行比较。 如你所见,使用 T-SQL 比较同一行中的列非常容易,但是比较不同行(例如存储开始时间的行,以及同一表中存储相应停止时间的另一行)中的值的方法就不那么明显了。 对于这些类型的查询,自联接这一技术会很有用。
要完成此类任务,应考虑以下准则:
- 在 FROM 子句中定义同一表的两个实例,并根据需要使用内部或外部联接来联接它们。
- 使用表别名来区分同一个表的两个实例。
- 使用 ON 子句来提供筛选器,将表的一个实例的列与该表的另一个实例的列进行比较。