我正在从详细信息表中执行大量插入到SQL Server中的摘要表中。我目前正在使用LEFT OUTER JOIN来确定详细信息表中的行是否已经在插入之前存在于摘要表中,如下例所示:
INSERT INTO TableA
(columnA
,columnB
,columnC)
SELECT
b.columnA,
b.columnB,
b.columnC
FROM TableB b
LEFT OUTER JOIN TableA a
on a.columnA = b.columnA
WHERE
a.columnA IS NULL
我发现即使没有要插入的行,此方法也需要相当长的时间,因为它必须比较所有行以确定已存在的行。在这种情况下,我通常会考虑向TableB
添加一个标志来说明已插入的行。
但是TableB
中要插入TableA
行的行有几种不同的情况需要多个标记,我宁愿不使用存储空间,因为TableB
是非常的大而且越来越大。
感谢您的任何建议。
答案 0 :(得分:3)
INSERT INTO TableA (columnA, columnB, columnC)
SELECT
b.columnA,
b.columnB,
b.columnC
FROM TableB as b
where not exists (select 1 from TableA as xx where xx.columnA = b.columnA) ;