Click here to view and discuss this page in DocCommentXchange. In the future, you will be sent there automatically.

SQL Anywhere 11.0.1 (中文) » SQL Anywhere 服务器 - SQL 的用法 » 查询和修改数据 » 连接:从多个表检索数据 » 专用连接

 

自连接

自连接中,表通过引用使用不同相关名的同一个表,与其自身连接。

示例 1

以下自连接生成雇员对列表。每一个雇员姓名与各雇员姓名彼此组合在一起显示。

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 的那些行,消除了重复行。

示例 2

下面的自连接使用相关名 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
... ... ... ...