はLEFT JOIN
、左側の各行を右側の各行と照合してから、フィルタリングします。どちらのテーブルでも一意ではないと仮定するとpatid
、一致する可能性のある組み合わせの数が非常に多くなる可能性があります。
次のことを試してください。
SET NOCOUNT ON;
GO
CREATE TABLE #t1 (Id INT NOT NULL);
CREATE TABLE #t2 (Id INT NOT NULL);
GO
INSERT #t1 (Id)
VALUES (1);
GO 100
INSERT #t2 (Id)
SELECT Id FROM #t1;
GO
次に、左結合クエリフォームの実行プランを確認します。
SELECT *
FROM #t1
LEFT OUTER JOIN #t2 ON #t1.Id = #t2.Id
WHERE #t2.Id IS NULL;
実行プランを見ると、ハッシュ結合は10,000の実際の行を示しています(#t1から100 x#t2から100)。これは、次のT-SQL構文のいずれかを使用して存在(または存在しない)をチェックすることの利点を示しています。
SELECT #t1.Id
FROM #t1
WHERE NOT EXISTS (SELECT * FROM #t2 WHERE Id = #t1.Id);
-- #t2.Id must not contain any NULLs for this to be correct
SELECT #t1.Id
FROM #t1
WHERE Id NOT IN (SELECT #t2.Id FROM #t2);
-- Returns DISTINCT #t1 values
SELECT Id
FROM #t1
EXCEPT
SELECT Id
FROM #t2;
存在の欠如をチェックすると、エンジンが短絡する可能性があります。これは、アンチセミジョインによるものです。最初の一致が見つかるとすぐに、次のレコードに移動します。詳細については、このブログ投稿を参照してください。