web-dev-qa-db-ja.com

Oracle Alternative to EXISTS EXCEPT

ここに投稿され、回答された問題に対して、オラクルにも同様に洗練されたソリューションがあるのだろうか。

NULLSを含むことができる列の比較-よりエレガントな方法はありますか?

このソリューション(受け入れられたソリューション)をOracle環境で機能させることができません。

1
GWR

これは、受け入れられた答えと同等のOracleである必要があります。

SELECT *
FROM a a1 
  JOIN b b1 
    ON a1.id = b1.id 
   AND EXISTS(SELECT * FROM a a2 where a2.id = a1.id
              MINUS 
              SELECT * FROM b b2 where b2.id = b1.id);

これまでにselect a.*を見たことがありません(つまり、定数値の代わりにエイリアスを使用するselect句のないFROM)が、相互に関連するサブクエリにマップされると思います

ある日の答えはOracleでも同様に機能することに注意してください(exceptminusに置き換える場合)。

WITH a_minus_b AS (
  SELECT * 
  FROM A
  minus 
  SELECT *
  FROM B
)
SELECT * 
FROM a_minus_b T 
   JOIN B ON T.ID = B.ID;

SQLFiddle: http://sqlfiddle.com/#!4/3f369/1


完全を期すために:標準SQLでは、これは次のように記述できます。

SELECT *
FROM a 
  JOIN b 
    ON a.id = b.id 
where (a.string, a.dt, a.b, a.num) is distinct from (b.string, b.dt, b.b, b.num);

これは例えばPostgresでサポート: http://sqlfiddle.com/#!15/b431b/1