【问题标题】:Multiple LEFT OUTER JOIN on multiple tables多个表上的多个 LEFT OUTER JOIN
【发布时间】:2018-02-12 15:50:37
【问题描述】:

我想转换以下 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" : 无效标识符"

【问题讨论】:

  • 如果你的dbms标签是oracle,那么@就不是赋值的标志。

标签: sql oracle


【解决方案1】:

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;

我总是以内部连接开始连接链,然后是left outer join。我很少使用right joinfull join。内连接定义了结果集中的行,所以它们排在第一位。

【讨论】:

  • 只有一点 Gordon,如果@Platus 想要保持列的隐含顺序,他必须SELECT a.*, b.*, c.*, d.* FROM... - 这取决于他需要多么忠实地重现原始查询,他不'不指示列顺序是否相关。正如您所说,RIGHT JOIN 是最稀有的野兽 - 我认为在构建查询时从左到右始终如一,以至于我很难想象它的效果!
【解决方案2】:

你不应该混合显式和隐式sintax

  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 呢,我不需要在某处提及它吗?
  • 答案已更新 .. ...第二个 tableA 是 TABLEB
  • 错字,第 3 行应该说“A.Z”而不是“U.Z”。也没有分号。
【解决方案3】:

试试这个:

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

【讨论】:

    猜你喜欢
    • 2012-06-21
    • 1970-01-01
    • 2013-04-16
    • 2017-06-18
    • 2014-10-23
    • 2014-07-19
    • 1970-01-01
    • 2023-02-10
    • 2020-10-02
    相关资源
    最近更新 更多