2012-02-10 20 views
2

別のテーブルに入れるデータの一時テーブルがあるとしますが、その前に宛先テーブルにすでに存在する一時テーブルの行を削除したいとします。データベースに挿入する前に重複を削除する

左の外部結合を使用して重複する行を特定することを考えていますが、次にこれらの行をどのようにしてテンポラリテーブルから削除できますか?

私は正しいアプローチを取っていますか、データを転送した後に重複を削除する方が良いでしょうか?

+1

あなたはどのRDBMSを使用していますか? –

+0

RDBMS?私はSQL Server管理スタジオ2008にいます。それはあなたの質問に答えますか? – sooprise

+0

一時テーブルから重複を削除した後に、あなたは何をするつもりですか? – Ice

答えて

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百万行の複製をスキャンする必要があります。

関連する問題