2016-07-18 16 views
1

Oracleデータベースに対してクエリを実行しようとしています。複数の結合を持つOracle ROWNUM

マイテーブル構造である:

  • D - 一対一
  • O、O - R一対多
  • O - 多対多M(VIA MTM)

私は次のクエリを使用しています:

SELECT o.id ID, ROWNUM rn            /*row 1*/ 
FROM TABLE_D d 
LEFT JOIN TABLE_O o ON d.O_ID=o.ID 
RIGHT JOIN TABLE_R r ON r.O_ID = o.ID AND r.TYPE = 'SOME_TYPE'   /*row 4*/ 
RIGHT JOIN TABLE_MTM mtm ON o.ID = mtm.ORD_ID       /*row 5-6*/ 
RIGHT JOIN TABLE_M m ON mtm.M_ID = m.ID AND m.TYPE = 'SOMETHING_ELSE' /*row 5-6*/ 

WHERE o.ACTIVE=0 

ORDER BY o.SOME_COL ASC; 

(これはほんの少しのpです私の完全な質問の芸術;はい、私はROWNUM、 'd'テーブル、そしてすべてが必要です)

  • このクエリを実行すると結果は返されません。私は4行目を削除した場合、私はSELECTからROWNUMを削除した場合
  • 、それは
  • 結果を返し、それは私が5行目を削除し、6行場合、それは結果を返し
  • 結果返します。

私は何が欠けているのか教えていただけますか?

更新: すべてがOracle 12c上でうまく動作します。 10gでは正しく動作しません。あなたは多くのものが欠けている

+0

行1のROWNUMにテーブルの別名 "d"を接頭してみましたか? –

+0

ROWNUMはテーブルの列ではありません。 –

答えて

1

SELECT o.id ID, ROWNUM as rn            /*row 1*/ 
FROM TABLE_D d LEFT JOIN 
    TABLE_O o 
    ON d.O_ID = o.ID AND o.ACTIVE = 0 LEFT JOIN 
    TABLE_R r 
    ON r.O_ID = o.ID AND r.TYPE = 'SOME_TYPE' LEFT JOIN   /*row 4*/ 
    TABLE_MTM mtm 
    ON o.ID = mtm.ORD_ID LEFT JOIN       /*row 5-6*/ 
    TABLE_M m 
    ON mtm.M_ID = m.ID AND m.TYPE = 'SOMETHING_ELSE' /*row 5-6*/ 
ORDER BY o.SOME_COL ASC; 

まず、LEFT JOINため、テーブルの上に条件がON句ではないWHERE句にする必要があります。第2に、RIGHT JOINの場合、の最初のテーブルの条件はON句になります。 第2のテーブルの条件(RIGHT JOINの場合)は、行をフィルタリングしません。

実際に何をしているのか本当に分かっているのでなければ、LEFT JOINRIGHT JOINを同じクエリに混ぜて使用しないでください。私はLEFT JOINと上記の構成が正しいと思われる。

+0

答えをありがとう。ベストプラクティスのアドバイスは本当にありがたいですが、なぜこれが起こっているのかまだ分かりません。 @JakabfiAttila。 –

+0

。 。恐らく 'o.ACTIVE = 0'を持つ行はないので、左と右の結合の組み合わせに従うのが難しいので、他の条件もあるかもしれません。 –

関連する問題