SQLでテーブルにデータをMergeしたいとき、2,3行のデータで別にテーブルを用意するまでもないものだった場合、どうすべきでしょうか。
わざわざMergeにするのは、Insertだとデータのダブりを避けたいからですが、Merge文は基本的にテーブル同士のデータ結合をさせるものという作りなので、こういう場合にはそぐわないよなー、と思っていましたが、擬似的にテーブルっぽくしてMergeさせてしまうやり方を見つけました。
最初に考えたInsertをするやつというのは例えばこんな感じですね。
INSERT INTO T_Target ([ID] ,[Title] ,[Category]) VALUES (@ID ,@Title ,@Category) ;
これは、ID、Title、Categoryというカラムを持つT_Targetテーブルに、@ID、@Title、@Categoryというデータのセットを挿入するというものです。
@が付いているのでわかりづらければ、「5、タイトルあああ、カテゴリーいいい」とでもしておきましょうか。
で、これだとこのデータのセットがすでにテーブルT_Targetにあったら、重複してしまうわけですね。
これを避けたいのでMerge文を使います。
MERGE INTO T_Target AS T USING (SELECT @ID AS [ID] ,@Title AS [Title] ,@Category AS [Category] ) AS S ON T.ID = S.ID AND T.Title = S.Title AND T.Category = S.Category WHEN NOT MATCHED THEN INSERT ([ID] ,[Title] ,[Category] ) VALUES ([ID] ,[Title] ,[Category] );
データのセットをSとしてT_Targetにぶつける疑似テーブルにしているのが面白いですね。
別にTmpテーブルを作るまでもない、ということで。
データのセットが数個のときは、これくらいの対応で良いのかな、と思います。
それ以上になるとTmpテーブルに一旦格納してからMergeさせたほうが早い気がしますが。