2012-02-10 77 views
2

假设我有一张要放入另一个表的数据的临时表,但在此之前,我想删除临时表中已存在于目标表中的任何行。在插入到数据库之前删除重复项

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

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

+1

您使用的是什么RDBMS? – 2012-02-10 16:55:46

+0

RDBMS?我在SQL服务器管理工​​作室2008年。这是否回答你的问题? – sooprise 2012-02-10 16:56:47

+0

从临时表中删除重复项后,你打算做什么? – Ice 2012-02-11 17:25:45

回答

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; 

不管你做的是否正确,不知道。将需要更多的信息和测试来确定哪种方法最好。无论您最终使用哪种方法,您都必须扫描2百万行重复数据。