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 的用法 » 查询和修改数据 » 连接:从多个表检索数据 » 键连接 » 表的表达式的键连接

 

表的表达式列表的键连接

为了给两个表表达式列表的键连接生成连接条件,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;