代码之家  ›  专栏  ›  技术社区  ›  Platus

多个表上的多个左外部联接

  •  8
  • Platus  · 技术社区  · 7 年前

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

    3 回复  |  直到 7 年前
        1
  •  9
  •   Gordon Linoff    7 年前

    这个 join 在…上 D 是内部联接,其余为左侧外部联接:

    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 join full join 很少有。内部联接定义结果集中的行,因此它们排在第一位。

        2
  •  3
  •   ScaisEdge    7 年前

    您不应该混合显式和隐式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使用内部联接(或联接)

        3
  •  0
  •   Joe Taras    7 年前

    尝试以下操作:

    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
    

    TABLEB TABLEC 进入 LEFT OUTER JOIN (您使用了+) TABLED 进入 INNER JOIN