当自然连接至少有一侧有多个表表达式时,SQL Anywhere 通过比较连接运算符两侧的列集合,查找同名的列,由此来生成连接条件。
例如,在下列语句中
SELECT * FROM (A JOIN B) NATURAL JOIN (C JOIN D); |
有两个表表达式。表表达式 A JOIN B
中的列名称与表表达式 C JOIN D
中的列名称进行比较,然后为每个明确的匹配列名称对生成一个连接条件。明确的匹配列对意味着列名称在两个表表达式中均出现,但不在同一个表表达式中出现两次。
如果有不明确的列名称对,将发出错误消息。但是,列名称可以在同一个表表达式中出现两次,条件是它还不匹配另一个表表达式中的列名称。
在表的表达式列表位于自然连接的至少一侧时,为列表中的每一表的表达式生成单独的连接条件。
考虑以下表:
表 A 包含名为 a、b 和 c 的列
表 B 包含名为 a 和 d 的列
表 C 包含名为 d 和 c 的列
在本例中,(A,B) NATURAL JOIN C
连接可使 SQL Anywhere 生成两个连接条件:
ON A.c = C.c AND B.d = C.d |
如果 A-C 之间或 B-C 之间没有公用列名称,将发出错误消息。
如果表 C 包含列 a、d 和 c,则连接 (A,B) NATURAL JOIN C
无效。原因在于:列 a 出现在所有三个表中,因此连接是不明确的。
以下示例回答的问题是:提供每一笔销售的相关信息,例如销售的产品及销售人员?
SELECT * FROM ( Employees KEY JOIN SalesOrders ) NATURAL JOIN ( SalesOrderItems KEY JOIN Products ); |
这等效于
SELECT * FROM ( Employees KEY JOIN SalesOrders ) JOIN ( SalesOrderItems KEY JOIN Products ) ON SalesOrders.ID = SalesOrderItems.ID; |
Copyright © 2009, iAnywhere Solutions, Inc. - SQL Anywhere 11.0.1 |