使用ANSI标准在oracle中进行外连接

时间:2014-01-10 12:03:23

标签: sql oracle join

select ...
from A left outer join B on (B.x=A.x)
left outer join C on (C.y=A.y)

希望在表C中添加表D的一个附加连接,条件为D.z = C.z

select ...
from A left outer join B on (B.x=A.x)
left outer join C on (C.y=A.y), D inner join C on (D.z=C.z)

但是,在添加此部分之后查询不起作用“,D内部连接C on(D.z = C.z)”。

有什么建议吗?

2 个答案:

答案 0 :(得分:4)

您应该添加left outer join D on (D.z=C.z)。如果使用INNER JOIN,则从A和B中删除与C和D无关的行

select ...
from A left outer join B on (B.x=A.x)
left outer join C on (C.y=A.y)
left outer join D on (D.z=C.z)

答案 1 :(得分:0)

我的理解是,不只是表C,而是CD之间的内部联接的结果,您希望外部联接到表A

如果是这样,那么@valex's suggestion是表示该逻辑的替代但等效的方式。

在某些SQL产品中,语法允许您完全按照预期写出逻辑:

…
FROM
  A
  LEFT JOIN B ON (B.x=A.x)
  LEFT JOIN
    C
    INNER JOIN D ON (D.z=C.z)
  ON (C.y=A.y)

Oracle不支持此类语法。但是你可以像这样重写查询,以使语法更接近于预期的逻辑:

…
FROM
  C
  INNER JOIN D ON (D.z=C.z)
  RIGHT JOIN A ON (C.y=A.y)
  LEFT  JOIN B ON (B.x=A.x)

现在很明显,CD应该是内连接的,并且它们的结果应该外部连接到AA位于外部连接的一侧,这次是右侧,因此RIGHT JOIN),然后是BA的外连接。

尽管如此,正如我所说,@ valex是一个相同的建议,应该产生相同的结果。