ここで解決すべきことが 2 つあります。最初のケースでは、除外テーブルには実際のテーブルと同じ数の列があると説明しました。ここでは、このテーブルの一部の列は「NULL 可能」であり、一部はそうでない可能性があると想定しています。そのため、除外中はそれにも注意する必要があります。パフォーマンス上の理由から、「左結合」はここで使用するのに適した候補であり、必要な場合にのみ選択した列で MATCHING を実行できます。あなたのケースでは、すべての列が一致する必要があるように見えますが、将来、Identity/datetime/timestamp のような列がテーブルに追加されたかどうかを考えてください。以下のコードを参照してください。このテーブル内のデータの量が多い場合、適切な非クラスター化および/またはフィルター インデックスを使用するとパフォーマンスが向上しますが、ビュー クエリが遅い場合は後の段階になります。
あなたが言及した2番目の部分については、後で場所コードを完全に除外することを決定する可能性があり、階層的な依存関係があります。正確な要件があるまで、これを別にしておくといいでしょう。
DECLARE @AllData TABLE
(
ID INT NOT NULL PRIMARY KEY
,FName sysname NOT NULL
,LName sysname NOT NULL
,MName sysname NULL
)
DECLARE @ExcludeData TABLE
(
ID INT NOT NULL PRIMARY KEY
,FName sysname NOT NULL
,LName sysname NOT NULL
,MName sysname NULL
)
INSERT INTO @AllData( ID, FName, LName, MName )
SELECT 1,'Fname1','Lname1','MName1'
UNION ALL SELECT 2,'Fname2','Lname2',NULL
UNION ALL SELECT 3,'Fname3','Lname3','Mname3'
UNION ALL SELECT 4,'Fname4','Lname4',NULL
INSERT INTO @ExcludeData( ID, FName, LName, MName )
SELECT 1,'Fname1','Lname1','MName1'
UNION ALL SELECT 2,'Fname2','Lname2',NULL
SELECT a.ID,a.FName,a.LName,a.MName
FROM @AllData a
LEFT JOIN @ExcludeData b
ON
((a.ID=b.ID) OR (a.id IS NULL AND b.id IS NULL))
AND
((a.FName=b.FName) OR (a.FName IS NULL AND b.FName IS NULL))
AND
((a.LName=b.LName) OR (a.LName IS NULL AND b.LName IS NULL))
AND
((a.MName=b.MName) OR (a.MName IS NULL AND b.MName IS NULL))
WHERE
(b.ID IS NULL AND b.FName IS NULL AND b.LName IS NULL AND b.MName IS NULL)