多个表的多个LEFT OUTER JOIN

9

我希望将以下Oracle SQL查询语法转换为使用LEFT OUTER JOIN而不是(+)

SELECT      *
FROM        TABLEA A, TABLEB B, TABLEC C, TABLED D
WHERE       MY_COL = @col_val
AND         A.X = B.X(+)
AND         B.Y = C.Y(+)
AND         D.Z=A.Z

以下是我迄今为止尝试过的:

SELECT *
FROM TABLEA A, TABLEB B, TABLEC C, TABLED D
LEFT OUTER JOIN TABLEA A ON A.X = B.X
LEFT OUTER JOIN TABLEC C ON B.Y = C.Y
WHERE MY_COL = @col_val
AND D.Z = A.Z;

但是我遇到了错误:

"ORA-00904: "B"."X" : 无效的标识符"


该错误与 "B"."X" 标识符无效有关。

如果dbms的标签是oracle,那么@不能作为赋值符号。 - Barbaros Özhan
3个回答

9

D上的join是内连接,其余的是左外连接:

SELECT *
FROM TABLEA A JOIN
     TABLED D
     ON D.Z = A.Z LEFT JOIN
     TABLEB B
     ON A.X = B.X LEFT JOIN
     TABLEC C
     ON B.Y = C.Y 
WHERE MY_COL = @col_val;

我通常会以内连接(inner joins)开启连接链,接着使用左外连接(left outer join),很少用右连接(right join),全连接(full join)更是几乎不用。内连接定义了结果集中的行,因此它们应该首先出现。


1
只有一个要点,Gordon,如果Platus想要维护列的暗示顺序,他必须使用"SELECT a.*,b.*,c.,d. FROM..."-这取决于他需要多么忠实地重现原始查询,他没有指示列的顺序是否相关。正如你所说,"RIGHT JOIN"是最罕见的野兽——我认为在构建一个查询时从左到右保持一致,以至于我很难想象它的影响! - Steve

3

您不应该混合使用显式和隐式语法。

  SELECT *
  FROM TABLEA A 
  INNER JOIN TABLEL L ON L.Z = A.Z
  LEFT OUTER JOIN TABLEB B ON A.X = B.X
  LEFT OUTER JOIN TABLEC C ON B.Y = C.Y
  WHERE A.MY_COL = @col_val

你应该在TABLEL表中使用内连接(或连接)。


谢谢,但是TABLEB怎么办?我不需要在某个地方提到它吗? - Platus
答案已更新...第二个表格A是表格B。 - ScaisEdge
笔误,第三行应该是"A.Z"而不是"U.Z"。同时没有分号。 - kfinity

0

试试这个:

SELECT *
FROM TABLEA A
LEFT OUTER JOIN TABLEB B ON A.X = B.X
LEFT OUTER JOIN TABLEC C ON B.Y = C.Y
INNER JOIN TABLED D ON D.Z = A.Z
WHERE MY_COL = @col_val

TABLEBTABLEC使用LEFT OUTER JOIN(您使用了+),而TABLED则使用INNER JOIN


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接