在自连接中,表通过引用使用不同相关名的同一个表,与其自身连接。
以下自连接生成雇员对列表。每一个雇员姓名与各雇员姓名彼此组合在一起显示。
SELECT a.GivenName, a.Surname, b.GivenName, b.Surname FROM Employees AS a CROSS JOIN Employees AS b; |
GivenName | Surname | GivenName | Surname |
---|---|---|---|
Fran | Whitney | Fran | Whitney |
Fran | Whitney | Matthew | Cobb |
Fran | Whitney | Philip | Chin |
Fran | Whitney | Julie | Jordan |
... | ... | ... | ... |
因为 Employees 表有 75 行,所以此连接包含 75 x 75 = 5625 行。它还包括将每一雇员与他们自己一起列出的行。例如,它包括以下行:
GivenName | Surname | GivenName | Surname |
---|---|---|---|
Fran | Whitney | Fran | Whitney |
要排除包含同一姓名两次的行,则添加一个连接条件,指示雇员 ID 应互不相同。
SELECT a.GivenName, a.Surname, b.GivenName, b.Surname FROM Employees AS a CROSS JOIN Employees AS b WHERE a.EmployeeID != b.EmployeeID; |
如果没有这些重复行,该连接包含 75 x 74 = 5550 行。
该新连接包含将每个雇员与其他每个雇员配对的行,但因为每个姓名对可以按两种可能的顺序出现,所以每一对出现两次。例如,以上连接的结果包含以下两行。
GivenName | Surname | GivenName | Surname |
---|---|---|---|
Matthew | Cobb | Fran | Whitney |
Fran | Whitney | Matthew | Cobb |
如果姓名的顺序不重要,则可以生成包含 (75 x 74)/2 = 2775 个唯一对的列表。
SELECT a.GivenName, a.Surname, b.GivenName, b.Surname FROM Employees AS a CROSS JOIN Employees AS b WHERE a.EmployeeID < b.EmployeeID; |
此语句通过只选择雇员 a 的 EmployeeID 小于雇员 b 的 EmployeeID 的那些行,消除了重复行。
下面的自连接使用相关名 report 和 manager 来区分 Employees 表的两个实例,并且创建雇员及其经理的列表。
SELECT report.GivenName, report.Surname, manager.GivenName, manager.Surname FROM Employees AS report JOIN Employees AS manager ON (report.ManagerID = manager.EmployeeID) ORDER BY report.Surname, report.GivenName; |
此语句生成以下部分显示的结果。雇员姓名出现在左侧的两列中,其经理的姓名在右侧显示。
GivenName | Surname | GivenName | Surname |
---|---|---|---|
Alex | Ahmed | Scott | Evans |
Joseph | Barker | Jose | Martinez |
Irene | Barletta | Scott | Evans |
Jeannette | Bertrand | Jose | Martinez |
... | ... | ... | ... |
以下自连接会生成一个列表,其中包含具有两级报告的所有经理以及他们拥有的次级报告的数量。
SELECT higher.managerID, count(*) second_level_reports FROM employees lower JOIN employees higher ON ( lower.managerID = higher.employeeID ) GROUP BY higher.managerID ORDER BY higher.managerID DESC; |
以上查询的结果包含下列各行:
ManagerID | second_level_reports |
---|---|
1293 | 30 |
902 | 23 |
501 | 22 |
![]() |
使用DocCommentXchange讨论此页。
|
版权 © 2013, SAP 股份公司或其关联公司. - SAP Sybase SQL Anywhere 16.0 |