私は2つのテーブルを持っています。FULL OUTER JOIN
テーブルの1つからいくつかのデータを除外しながら、両方のテーブルからレコードを取得したいと考えています。
- 14026 - 共通レコードの総数。
- 8428 - テーブル 1 の一意のレコード
- 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 つのクエリをどのように処理しているか説明してもらえますか?