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

 

理解复杂外连接

在查询包括使用外连接的表表达式时,连接的顺序是十分重要的。例如,A JOIN B LEFT OUTER JOIN C 被解释为 (A JOIN B) LEFT OUTER JOIN C。这意味着表表达式 (A JOIN B) 被连接到表 C。表表达式 (A JOIN B) 是保留的,表 C 是提供空值的。

考虑以下语句,在该语句中,A、B 和 C 是表:

SELECT *
FROM A LEFT OUTER JOIN B RIGHT OUTER JOIN C;

为了理解此语句,首先要记住,SQL Anywhere 是按从左到右的顺序对语句求值的,并且按以下所示添加括号。由此得到

SELECT *
FROM (A LEFT OUTER JOIN B) RIGHT OUTER JOIN C;

接下来,您可能想要将右外连接转换为左外连接,使这两个连接的类型相同。为此,只需调换右外连接中的表的位置,得到:

SELECT *
FROM C LEFT OUTER JOIN (A LEFT OUTER JOIN B);

对于嵌套的外连接,表 A 是保留的,表 B 是提供空值的。在第一个外连接中,表 C 是保留的。

您可按如下所示解释该连接:

  • 将 A 连接到 B,保留 A 中的所有行。

  • 接下来,将 C 与 A 和 B 的连接的结果相连接,保留 C 中的所有行。

该连接没有 ON 子句,因此缺省为键连接。SQL Anywhere 为此类型的连接生成连接条件的方法在不包含逗号的表的表达式的键连接中予以说明。

此外,外连接的连接条件必须只包括以前已在 FROM 子句中引用的表。此限制依据 ANSI/ISO 标准,并且强制实施以避免出现多义性。例如,以下两个语句在语法上是不正确的,因为在引用表 C 之前已在连接条件中引用表 C。

SELECT *
FROM (A LEFT OUTER JOIN B ON B.x = C.x) JOIN C;

SELECT *
FROM A LEFT OUTER JOIN B ON A.x = C.x, C;