假设我有一个临时表数据要放入另一个表中,但在此之前,我想删除目标表中已存在的临时表中的所有行。
我正在考虑使用左外连接来识别哪些行是重复的,但是我怎样才能从临时表中删除这些行?
我采取了正确的方法,还是在传输数据后删除重复项会更好?
答案 0 :(得分:2)
假设col1 / col2上有一个索引,这可能比尝试在插入过程中清除重复项更好:
DELETE t
FROM #temp AS t
WHERE NOT EXISTS
(
SELECT 1 FROM dbo.table
WHERE col1 = t.col1
AND col2 = t.col2
);
相当于杰克的方法是:
INSERT dbo.table(col1, col2)
SELECT col1, col2
FROM #temp AS t
WHERE NOT EXISTS
(
SELECT 1 FROM dbo.table
WHERE col1 = t.col1
AND col2 = t.col2
);
我假设您在#temp表上有一个唯一索引,因此您不需要DISTINCT
或GROUP BY
。您也可以首先从#temp表中删除重复项,例如单独的步骤,例如
;WITH t AS
(
SELECT col1, col2,
rn = ROW_NUMBER() OVER (PARTITION BY col1, col2 ORDER BY col1)
)
DELETE t WHERE rn > 1;
无论你做得对不对,都不知道。将需要更多信息和测试来确定哪种方法最好。无论您最终使用哪种方法,都必须扫描超过200万行的重复项。