Sql oracle中的外部连接与ANSI标准
要添加表D与表C的一个附加联接,条件为D.z=C.zSql oracle中的外部连接与ANSI标准,sql,oracle,join,Sql,Oracle,Join,要添加表D与表C的一个附加联接,条件为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内部连接C on(D.z=C.z)”后,查询不起作用 有什么建议吗?您应该只添加左外连接D(D.z=C.z)。如果使用内部联接,则会从A和B中删除与C和D未连接的行 select ... from A left outer join B on (B.x=A.x)
select ...
from A left outer join B on (B.x=A.x)
left outer join C on (C.y=A.y)
但是,添加此部分“D内部连接C on(D.z=C.z)”后,查询不起作用
有什么建议吗?您应该只添加
左外连接D(D.z=C.z)
。如果使用内部联接,则会从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), D inner join C on (D.z=C.z)
您只需在(D.z=C.z)上添加左外连接D即可。如果使用内部联接,则会从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), D inner join C on (D.z=C.z)
我的理解是,不只是表
C
,而是C
和D
之间的内部联接的结果,您希望外部联接到表A
如果是这样的话,那么这是一种替代但等效的方式来表示该逻辑
在某些SQL产品中,语法允许您完全按照预期编写逻辑:
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)
Oracle不支持这种语法。但您可以像这样重写查询,以使语法更接近地反映预期的逻辑:
…
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)
现在很明显,C
和D
应该是内部连接的,它们的结果应该是外部连接到A
(A
位于连接的外侧,这一次是右侧,因此右连接
),然后是B
到A
的外部连接
尽管如此,正如我所说,@valex的建议应该产生相同的结果。我的理解是,它不仅仅是表
C
,而是C
和D
之间的内部联接的结果,您希望外部联接到表A
如果是这样的话,那么这是一种替代但等效的方式来表示该逻辑
在某些SQL产品中,语法允许您完全按照预期编写逻辑:
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)
Oracle不支持这种语法。但您可以像这样重写查询,以使语法更接近地反映预期的逻辑:
…
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)
现在很明显,C
和D
应该是内部连接的,它们的结果应该是外部连接到A
(A
位于连接的外侧,这一次是右侧,因此右连接
),然后是B
到A
的外部连接
尽管如此,正如我所说,@valex的建议应该会产生相同的结果。您收到了什么错误消息?您收到了什么错误消息?之前是这样的。。选择。。。。从A、B、C、D开始,其中B.x=A.x(+)、C.y=A.y(+)、C.z=D.z不起作用,因为它说B和C之前应该连接。S、 将ANSI标准应用于外部连接,效果良好。但是,当我将最后一个条件添加为ANSI标准时,它不起作用。逻辑工作正常。谢谢然而,你能解释一下,在最后一行中,我们是r加D,对吗?但是我想要C和D之间的连接。上面的结果会是一样的吗?是的,但是C已经与A连接,第二个连接是这样的A->C->Dearier它是这样的。。选择。。。。从A、B、C、D开始,其中B.x=A.x(+)、C.y=A.y(+)、C.z=D.z不起作用,因为它说B和C之前应该连接。S、 将ANSI标准应用于外部连接,效果良好。但是,当我将最后一个条件添加为ANSI标准时,它不起作用。逻辑工作正常。谢谢然而,你能解释一下,在最后一行中,我们是r加D,对吗?但是我想要C和D之间的连接。上面的结果会一样吗?是的,但是C已经用A连接了第二个连接,所以A->C->D