初期データは次のとおりです。
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
)
s 3と7を確実Id
に除外するために、この醜いスクリプトの変更を行うことができます。本番テーブルには多くの可能なデータがあります(#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フィドルにあります
上記を行うためのよりエレガントな方法はありますか?