在查询包括使用外连接的表表达式时,连接的顺序是十分重要的。例如,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 子句,因此缺省为键连接。
此外,外连接的连接条件必须只包括以前已在 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; |
![]() |
使用DocCommentXchange讨论此页。
|
版权 © 2013, SAP 股份公司或其关联公司. - SAP Sybase SQL Anywhere 16.0 |