为了给两个表表达式列表的键连接生成连接条件,SQL Anywhere 检查该语句中的表对,并为每对表生成一个连接条件。最终的连接条件是用于每一对的连接条件的联合。每对表之间必须是一个外键关系。
以下示例连接两个表对:A-C 和 B-C。
SELECT * FROM ( A,B ) KEY JOIN C; |
SQL Anywhere 通过为两个对 A-C 和 B-C 的每一对生成连接条件,生成一个连接 C 与 (A,B)
的连接条件。它根据存在多个外键关系时的键连接规则生成连接条件:
对于每一对,SQL Anywhere 查找其角色名与主键表相关名相同的外键。如果正好只有一个外键满足此条件,则使用此外键。如果有多个外键关系,则认为该连接是不明确的,并且发出错误消息。
对于每一对,如果没有与表的相关名同名的外键,则 SQL Anywhere 将查找这些表间的任何外键关系。如果只有一个外键关系,则使用此外键关系。如果有多个外键关系,则认为该连接是不明确的,并且发出错误消息。
对于每一对,如果没有任何外键关系,则发出错误消息。
如果 SQL Anywhere 能够为每一对确定恰好一个连接条件,则它使用 AND 组合这些连接条件。
另请参见在有多个外键关系时的键连接。
以下查询返回向特定区域售出至少一个订单的所有销售人员的姓名。
SELECT DISTINCT Employees.Surname, FK_DepartmentID_DepartmentID.DepartmentName, SalesOrders.Region FROM ( SalesOrders, Departments AS FK_DepartmentID_DepartmentID ) KEY JOIN Employees; |
Surname | DepartmentName | Region |
---|---|---|
Chin | Sales | Eastern |
Chin | Sales | Western |
Chin | Sales | Central |
... | ... | ... |
此查询处理两对表:SalesOrders 和 Employees 以及 Departments AS FK_DepartmentID_DepartmentID 和 Employees。
对于 SalesOrders 和 Employees 这一对,没有任何外键具有与其中一个表同名的角色名。但是,存在一个与这两个表关联的外键 (FK_SalesRepresentative_EmployeeID)。该外键是关联这两个表的唯一外键,所以使用它,结果得到生成的连接条件
( Employees.EmployeeID = SalesOrders.SalesRepresentative )
。
对于 Departments AS FK_DepartmentID_DepartmentID 和 Employees 这一对,存在一个外键,其角色名与主键表的相关名同名。它是 FK_DepartmentID_DepartmentID,并且它与在该查询中为
Departments 表指派的相关名匹配。由于再没有其它外键的角色名与主键表的相关名同名,因此使用 FK_DepartmentID_DepartmentID 为该表对形成连接条件。生成的连接条件是 (Employees.DepartmentID = FK_DepartmentID_DepartmentID.DepartmentID)
。请注意,还有一个外键与这两个表关联,但因为它的名称不同于这两个表中的任何一个表的名称,所以不考虑它。
最终的连接条件是为每个表对生成的连接条件的联合。因此,以下查询是等效的:
SELECT DISTINCT Employees.Surname, Departments.DepartmentName, SalesOrders.Region FROM ( SalesOrders, Departments ) JOIN Employees ON Employees.EmployeeID = SalesOrders.SalesRepresentative AND Employees.DepartmentID = Departments.DepartmentID; |
Copyright © 2009, iAnywhere Solutions, Inc. - SQL Anywhere 11.0.1 |