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;
不管你做的是否正确,不知道。将需要更多的信息和测试来确定哪种方法最好。无论您最终使用哪种方法,您都必须扫描2百万行重复数据。
您使用的是什么RDBMS? – 2012-02-10 16:55:46
RDBMS?我在SQL服务器管理工作室2008年。这是否回答你的问题? – sooprise 2012-02-10 16:56:47
从临时表中删除重复项后,你打算做什么? – Ice 2012-02-11 17:25:45