在 ON 子句中引用的表必须是 ON 子句修饰的连接的一部分。例如,以下语句无效:
FROM ( A KEY JOIN B ) JOIN ( C JOIN D ON A.x = C.x ) |
问题在于:连接条件 A.x = C.x
引用表 A,而表 A 不是该连接条件修饰的连接(在此示例中为 C JOIN D
)的一部分。
但是,从 ANSI/ISO 标准 SQL99 和 Adaptive Server Anywhere 7.0 开始,此规则有一个例外:如果您在表表达式之间使用逗号,则连接的 ON 条件可以引用 FROM 子句中在语法上位于该条件前面的表。因此,以下语句是有效的:
FROM (A KEY JOIN B) , (C JOIN D ON A.x = C.x) |
有关逗号的详细信息,请参见逗号。
以下示例连接 SalesOrders 表与 Employees 表。结果中的每一行都反映 SalesOrders 表中 SalesRepresentative 列的值与 Employees 表中 EmployeeID 列的值匹配的行。
SELECT Employees.Surname, SalesOrders.ID, SalesOrders.OrderDate FROM SalesOrders JOIN Employees ON SalesOrders.SalesRepresentative = Employees.EmployeeID; |
Surname | ID | OrderDate |
---|---|---|
Chin | 2008 | 4/2/2001 |
Chin | 2020 | 3/4/2001 |
Chin | 2032 | 7/5/2001 |
Chin | 2044 | 7/15/2000 |
Chin | 2056 | 4/15/2001 |
... | ... | ... |
下面是关于此示例的一些说明:
此查询的结果中仅包含 648 行(每行对应 SalesOrders 表中的一行)。在矢量积的 48,600 行中,只有其中的 648 行在两个表中具有相同的雇员编号。
结果的排序没有任何意义。您可以添加一个 ORDER BY 子句对查询强制特定的顺序。
ON 子句包含没有在最终结果集中显示的列。
Copyright © 2009, iAnywhere Solutions, Inc. - SQL Anywhere 11.0.1 |