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

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

4

3 回答 3

13

表 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 将在先前连接的表中左连接。

于 2013-04-08T06:59:19.053 回答
4

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,尤其是在连接到链中第一个表以外的表时。

于 2013-04-08T07:33:26.707 回答
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)

谢谢

于 2014-12-22T10:47:33.073 回答