我可以通过以下查询来检查目标表中的记录现有。
Select *
From Table1
Where Column1 not in (select Column2 from Table2)
Select *
from Table1
left join Table2 where Table1.Column1 = Table2.Column2
Where Table2.IdColumn is Null
我想知道哪个查询有更好的效果。
答案 0 :(得分:5)
一般去NOT EXISTS
。
如果任一方的列可以为空(并且具有您可能想要的语义),则more efficient比NOT IN
左连接... Null有时会使用后面的过滤器进行整个连接以保留与is null
匹配的行,效率会低得多。
以下是一个证明这一点的例子。请注意NOT IN
计划中的额外运算符以及外部联接计划如何爆发以创建超过100万行的联接进入过滤器。
CREATE TABLE Table1 (
IdColumn INT IDENTITY PRIMARY KEY,
Column1 INT NULL,
Filler CHAR(8000) NULL,
UNIQUE(Column1, IdColumn) );
CREATE TABLE Table2 (
IdColumn INT IDENTITY PRIMARY KEY,
Column2 INT NULL,
Filler CHAR(8000) NULL,
UNIQUE(Column2, IdColumn) );
INSERT INTO Table2 (Column2)
OUTPUT INSERTED.Column2
INTO Table1(Column1)
SELECT number % 5
FROM master..spt_values
SELECT *
FROM Table1 t1
WHERE NOT EXISTS (SELECT *
FROM Table2 t2
WHERE t2.Column2 = t1.Column1)
SELECT *
FROM Table1
WHERE Column1 NOT IN (SELECT Column2
FROM Table2)
SELECT Table1.*
FROM Table1
LEFT JOIN Table2
ON Table1.Column1 = Table2.Column2
WHERE Table2.IdColumn IS NULL
DROP TABLE Table1, Table2