这里有两件事要解决。在第一种情况下,您已经解释了 Exclude 表的列数与实际表中的列数相同。我在这里假设此表中的某些列将是“可以为 NULL”的,而有些列可能不是。因此,在排除期间,您也需要注意这一点。由于性能原因,我看到“左连接”是一个很好的候选者,而且您只能在需要时对选定的列执行 MATCHING。在您的情况下,现在似乎所有列都需要匹配,但请考虑将来是否在表中添加了 Identity/datetime/timestamp 之类的列。请参阅下面的代码。如果此表中的数据量很大,则适当的非集群和/或过滤索引将帮助您提高性能,但如果您看到视图查询很慢,那是在稍后阶段。
对于您提到的第二部分,稍后您可能会决定完全排除位置代码并且存在分层依赖关系。我会说保持这个分开,直到你有确切的要求。
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)