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