2012-02-10 86 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百萬行重複數據。

相關問題