PL / SQL使用多个左连接

时间:2013-04-08 06:42:17

标签: sql oracle

SELECT * FROM Table A LEFT JOIN TABLE B LEFT JOIN TABLE C

从上面的代码片段中,表C将连接到(表B)或(表A LEFT JOIN表B中的数据)或(表A)?

3 个答案:

答案 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 BB 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

然后,您可能会遇到AC每个都有一个具有特定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)

由于