3

次の2つのバージョンのANSI準拠のSQL(機密データを保護するために列/テーブル名が変更されました)を使用しましたが、そのうちの1つは正しいロジックに従うことで私の要件を満たし、もう1つはそうではありません。

1)ANSI Join 1-Works

SELECT b.COLUMN_A,
  COUNT(a.COLUMN_A)
FROM TABLE1 a
RIGHT OUTER JOIN
  (SELECT COLUMN_A FROM TABLE2 WHERE COLUMN_X='TEST') b
ON  a.COLUMN_A = b.COLUMN_A
AND a.COLUMN_B in (SELECT FROM TABLE3 WHERE COLUMN_Y=5)  --WORKS
GROUP BY b.COLUMN_A

1) 次のような出力が得られます。

COLUMN_A  COUNT(COLUMN_A)
--------------------------
A       0
B       0
C       1
D       1
E       0

2) ANSI Join 2 - 機能しない

SELECT b.COLUMN_A,
  COUNT(a.COLUMN_A)
FROM TABLE1 a
RIGHT OUTER JOIN
  (SELECT COLUMN_A FROM TABLE2 WHERE COLUMN_X='TEST') b
ON  a.COLUMN_A = b.COLUMN_A
WHERE
a.COLUMN_B in (SELECT FROM TABLE3 WHERE COLUMN_Y=5)      --DOESN'T WORK
GROUP BY b.COLUMN_A

3) Oracle 独自の結合 - 機能しない

SELECT b.COLUMN_A,
  COUNT(a.COLUMN_A)
FROM TABLE1 a,(SELECT COLUMN_A FROM TABLE2 WHERE COLUMN_X='TEST') b
WHERE
a.COLUMN_A(+) = b.COLUMN_A
AND a.COLUMN_B in (SELECT FROM TABLE3 WHERE COLUMN_Y=5) --DOESN'T WORK
GROUP BY b.COLUMN_A

2) & 3) 次のような出力が得られます。

COLUMN_A  COUNT(COLUMN_A)
--------------------------
C       1
D       1

(2,ANSI) & (3,PROPRIETARY) が同等であることは理解しています。しかし、(1,ANSI) に相当する独自の SQL はありますか? どんな助けでも大歓迎です。ありがとう。編集:サンプル出力で質問を更新しました。

4

1 に答える 1

6

おそらくこの条件を変更したいと思うでしょう:

AND a.COLUMN_B in (SELECT FROM TABLE3 WHERE COLUMN_Y=5)

これのどちらかに:

AND a.COLUMN_B (+) in (SELECT FROM TABLE3 WHERE COLUMN_Y=5)

またはこれ:

AND (a.COLUMN_B IS NULL OR a.COLUMN_B in (SELECT FROM TABLE3 WHERE COLUMN_Y=5))

しかし、一般的には、ANSI構文を使用して外部結合を行うと思います。最初にOracle構文を学び、それに非常に慣れている人でも、ANSIは外部結合に対してはるかに明確です。

于 2011-04-29T15:06:22.673 に答える