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 通过比较连接运算符两侧的列集合,查找同名的列,由此来生成连接条件。

例如,在下列语句中

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;