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)”。
有什么建议吗?
答案 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
,而是C
和D
之间的内部联接的结果,您希望外部联接到表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)
现在很明显,C
和D
应该是内连接的,并且它们的结果应该外部连接到A
(A
位于外部连接的一侧,这次是右侧,因此RIGHT JOIN
),然后是B
到A
的外连接。
尽管如此,正如我所说,@ valex是一个相同的建议,应该产生相同的结果。