在插入数据库之前删除重复项

时间:2012-02-10 16:55:11

标签: sql-server-2008

假设我有一个临时表数据要放入另一个表中,但在此之前,我想删除目标表中已存在的临时表中的所有行。

我正在考虑使用左外连接来识别哪些行是重复的,但是我怎样才能从临时表中删除这些行?

我采取了正确的方法,还是在传输数据后删除重复项会更好?

1 个答案:

答案 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表上有一个唯一索引,因此您不需要DISTINCTGROUP 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万行的重复项。