这是初始数据:
CREATE TABLE #data
(
Id integer,
Surname varchar(50),
DOB datetime
)
INSERT INTO #data
values
(1,'smith', null),
(2,'jones', '01 jan 1970'),
(3,'vernon', null),
(4,'smith', '01 jan 1970'),
(5,'jones', '01 jan 1970'),
(6,'vernon', '01 jan 1970'),
(7,null, '01 jan 1970')
以下是排除列表:
CREATE TABLE #exclusions
(
ExcludedSurname varchar(50),
ExcludedDOB datetime
)
INSERT INTO #exclusions
values
('smith', '01 jan 1970'),
('jones', '01 jan 1970'),
('vernon', null),
(null, '01 jan 1970')
这是一个返回我有点意外结果的查询:
SELECT *
FROM #data a
WHERE
NOT EXISTS
(
SELECT 1
FROM #exclusions e
WHERE
a.DOB = e.ExcludedDOB and
a.Surname = e.ExcludedSurname
)
为了确保Id
排除 s 3 和 7,我可以对脚本进行这种丑陋的更改。生产表中有很多可能的数据(#data 的实时版本是 1000m 条记录)——这就是为什么我选择了这么多的替代品来null
.
SELECT *
FROM #data a
WHERE
NOT EXISTS
(
SELECT 1
FROM #exclusions e
WHERE
ISNULL(a.DOB, '01 JAN 2200') = ISNULL(e.ExcludedDOB, '01 JAN 2200') and
ISNULL(a.Surname,'AAAAAAAAAAAAAAAA') = ISNULL(e.ExcludedSurname,'AAAAAAAAAAAAAAAA')
)
这是在SQL Fiddle上
有没有更优雅的方式来完成上述操作?