挿入時に重複行をスキップ/無視する 質問する

挿入時に重複行をスキップ/無視する 質問する

次のテーブルがあります:

DataValue

DateStamp    ItemId   Value
----------   ------   -----
2012-05-22   1        6541
2012-05-22   2        12321
2012-05-21   3        32

tmp_holding_DataValue

DateStamp    ItemId   Value
----------   ------   -----
2012-05-22   1        6541
2012-05-22   4        87
2012-05-21   5        234

DateStampおよびはItemId主キー列です。

私は、1 日を通して定期的に実行される挿入を実行しています (ストアド プロシージャ内)。

insert into DataValue(DateStamp, ItemId, Value)
select DateStamp, ItemId, Value from tmp_holding_DataValue;

これにより、保持テーブル ( tmp_holding_DataValue) のデータがメイン データ テーブル ( DataValue) に移動します。その後、保持テーブルは切り捨てられます。

問題は、例のように、保持テーブルにメイン テーブルにすでに存在する項目が含まれている可能性があることです。キーは重複する値を許可しないため、手順は失敗します。

1 つのオプションとしては、挿入プロシージャに where 句を配置することですが、メイン データ テーブルには 1,000 万行以上あり、これには長い時間がかかる可能性があります。

挿入時に重複をスキップ/無視する手順を実行する他の方法はありますか?

ベストアンサー1

INSERT dbo.DataValue(DateStamp, ItemId, Value)
SELECT DateStamp, ItemId, Value 
FROM dbo.tmp_holding_DataValue AS t
WHERE NOT EXISTS (SELECT 1 FROM dbo.DataValue AS d
WHERE DateStamp = t.DateStamp
AND ItemId = t.ItemId);

おすすめ記事