Sql oracle中的外部连接与ANSI标准

Sql 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)

要添加表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)
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