使用自联接

已完成

到目前为止,我们使用的联接涉及不同的表。 在某些情况下,你可能需要检索表中的行,并将其与同一表中的其他行进行比较。 例如,在人力资源应用程序中,“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 子句来提供筛选器,将表的一个实例的列与该表的另一个实例的列进行比较。