在自连接中,表通过引用使用不同相关名的同一个表,与其自身连接。
以下自连接生成雇员对列表。每一个雇员姓名与各雇员姓名彼此组合在一起显示。
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 |
... | ... | ... | ... |
![]() |
使用DocCommentXchange 讨论此页。
|
版权 © 2010, iAnywhere Solutions, Inc. - SQL Anywhere 12.0.0 |