当要连接的两个表表达式都不包含逗号时,SQL Anywhere 将检查语句中表对中的外键关系,并且生成单个连接条件。
例如,以下连接具有两个表对:A-C 和 B-C。
(A NATURAL JOIN B) KEY JOIN C |
SQL Anywhere 通过查看表对 A-C 和 B-C 中的外键关系为 C 与 (A NATURAL JOIN B)
的连接生成一个连接条件。它根据存在多个外键关系时确定键连接的规则为这两对表生成一个连接条件:
首先,它在 A-C 和 B-C 中查找一个外键,该单个外键的角色名与其所引用的某一主键表的相关名相同。如果正好只有一个外键满足此条件,则使用此外键。如果有多个外键的角色名与主键表的相关名相同,则认为该连接是不明确的,并且发出错误消息。
如果没有任何外键与主键表的相关名同名,则 SQL Anywhere 将查找这些表间的任何外键关系。如果只有一个外键关系,则使用此外键关系。如果有多个外键关系,则认为该连接是不明确的,并会发出错误消息。
如果没有任何外键关系,则发出错误消息。
有关详细信息,请参见在有多个外键关系时的键连接。
以下查询查找职位为销售代表的所有雇员及其所在部门。
SELECT Employees.Surname, FK_DepartmentID_DepartmentID.DepartmentName FROM ( Employees KEY JOIN Departments AS FK_DepartmentID_DepartmentID ) KEY JOIN SalesOrders; |
该查询解释如下。
SQL Anywhere 考虑表表达式 ( Employees KEY JOIN Departments as FK_DepartmentID_DepartmentID )
并基于外键 FK_DepartmentID_DepartmentID 生成连接条件 Employees.DepartmentID = FK_DepartmentID_DepartmentID.DepartmentID
。
接着 SQL Anywhere 考虑 Employees/SalesOrders 和 Departments/SalesOrders 两对表。请注意,表 SalesOrders 和表 Employees 之间以及表 SalesOrders 和表
Departments 之间只能存在一个外键,否则该连接是不明确的。在表 SalesOrders 和表 Employees 之间碰巧只有一个外键关系 (FK_SalesRepresentative_EmployeeID),在表 SalesOrders
和表 Departments 之间没有外键关系。因此,生成的连接条件是 SalesOrders.EmployeeID = Employees.SalesRepresentative
。
以下查询因此等效于前一查询:
SELECT Employees.Surname, Departments.DepartmentName FROM ( Employees JOIN Departments ON ( Employees.DepartmentID = Departments.DepartmentID ) ) JOIN SalesOrders ON ( Employees.EmployeeID = SalesOrders.SalesRepresentative ); |
Copyright © 2009, iAnywhere Solutions, Inc. - SQL Anywhere 11.0.1 |