SELECT * FROM Table A LEFT JOIN TABLE B LEFT JOIN TABLE C
从上面的代码片段中,表C将连接到(表B)或(表A LEFT JOIN表B中的数据)或(表A)?
答案 0 :(得分:13)
表C将保持加入 1.(表B)或2.(来自表A LEFT JOIN的数据 表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 jon A
不同)因此,顺序很重要,C将在之前的连接表中保持连接。
答案 1 :(得分:4)
Oracle documentation对于如何处理联接非常具体:
要执行三个或更多表的连接,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
上的连接条件,尤其是在连接到链中第一个表以外的表时。
答案 2 :(得分:1)
您需要正确提及列名才能运行查询。假设您正在使用:
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)
由于