SELECT * FROM Table A LEFT JOIN TABLE B LEFT JOIN TABLE C
从上面的代码片段中,表 C 将左连接到(表 B)或(来自表 A 左连接表 B 的数据)或(表 A)?
表 C 将左连接到 1.(表 B)或 2.(来自表 A 左连接表 B)或 3.(表 A)?
第二。但是加入条件将帮助您了解更多。
你可以写:
SELECT *
FROM Table A
LEFT JOIN TABLE B ON (A.id = B.id)
LEFT JOIN TABLE C ON (A.ID = C.ID)
但您可以:
SELECT *
FROM Table A
LEFT JOIN TABLE B ON (A.id = B.id)
LEFT JOIN TABLE C ON (A.id = C.id and B.code = C.code)
因此,您可以加入先前表中的每个字段,并加入先前联接的“结果”(尽管引擎可能会选择获取结果的方式)。
将左连接视为非交换操作(A left join B
与 不同B left join A
)因此,顺序很重要,C 将在先前连接的表中左连接。
Oracle 文档非常具体地说明了连接的处理方式:
为了执行三个或更多表的连接,Oracle 首先根据连接条件比较它们的列来连接两个表,然后根据包含连接表和新表的列的连接条件将结果连接到另一个表。Oracle 将继续此过程,直到所有表都连接到结果中。
这是处理连接的逻辑方法,并且与 ANSI 标准一致(换句话说,所有数据库引擎都按顺序处理连接)。
但是,当实际执行查询时,优化器可能会选择以不同的顺序运行连接。结果需要在逻辑上与按照查询中给定的顺序处理连接相同。
此外,连接条件可能会导致出现一些意外情况。因此,如果您有:
from A left outer join
B
on A.id = B.id left outer join
C
on B.id = C.id
然后,您可能会遇到这样的情况,其中A
每个C
都有具有特定 id 的行,但B
没有。使用此公式,您将看不到行中的行,C
因为它正在连接到NULL
。因此,请注意 上的连接条件left outer join
,尤其是在连接到链中第一个表以外的表时。
您需要正确提及列名才能运行查询。假设您正在使用:
SELECT *
FROM Table A
LEFT JOIN TABLE B ON (A.id = B.id)
LEFT JOIN TABLE C ON (A.id = C.id and B.code = C.code)
然后你可能会得到以下错误:
ORA-00933:SQL 命令未正确结束。
所以为了避免它,你可以尝试:
SELECT A.id as "Id_from_A", B.code as "Code_from_B"
FROM Table A
LEFT JOIN TABLE B ON (A.id = B.id)
LEFT JOIN TABLE C ON (A.id = C.id and B.code = C.code)
谢谢