0

私は2つのテーブルを持っています。FULL OUTER JOINテーブルの1つからいくつかのデータを除外しながら、両方のテーブルからレコードを取得したいと考えています。

  1. 14026 - 共通レコードの総数。
  2. 8428 - テーブル 1 の一意のレコード
  3. 1512 - テーブル 2 の一意のレコード。

取得する必要がある合計レコード数は 23966 です。ただし、次のクエリは異なる結果を返します。

クエリ 1 -

SELECT DISTINCT pu.id,
       vm.id
FROM table1 vm
FULL OUTER JOIN (SELECT DISTINCT pu.id 
                 FROM table2 pu 
                 WHERE pu.column1 = 'filter1'
                 AND pu.column2 = 'filter2') pu ON vm.id = pu.id; 

出力 - 23966 行 (予想)。

クエリ 2 -

SELECT DISTINCT pu.id,
       vm.id
FROM table1 vm
FULL OUTER JOIN table2 pu ON vm.id = pu.id AND pu.column1 = 'filter1' AND pu.column2 = 'filter2';

出力 - 48804 行。

クエリ 3 -

SELECT DISTINCT pu.id,
       vm.id
FROM table1 vm
FULL OUTER JOIN table2 pu ON vm.id = pu.id 
WHERE (pu.column1 = 'filter1' AND pu.column2 = 'filter2')
OR (pu.column1 IS NULL AND pu.column2 IS NULL);

出力 - 21830。

私の理解によると、少なくとも 3 番目のクエリでもクエリ 1 と同じ結果が得られるはずです。SQL Server がこれら 3 つのクエリをどのように処理しているか説明してもらえますか?

4

0 に答える 0