SQL MERGE VALUE

PC

Warning: Invalid argument supplied for foreach() in /home/xs642990/dark-pla.net/public_html/wp-content/plugins/bravo-neo/bravo-neo.php(12) : eval()'d code on line 647

SQLでテーブルにデータをMergeしたいとき、2,3行のデータで別にテーブルを用意するまでもないものだった場合、どうすべきでしょうか。

わざわざMergeにするのは、Insertだとデータのダブりを避けたいからですが、Merge文は基本的にテーブル同士のデータ結合をさせるものという作りなので、こういう場合にはそぐわないよなー、と思っていましたが、擬似的にテーブルっぽくしてMergeさせてしまうやり方を見つけました。

最初に考えたInsertをするやつというのは例えばこんな感じですね。

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
INSERT INTO T_Target
([ID]
,[Title]
,[Category])
VALUES
(@ID
,@Title
,@Category)
;
INSERT INTO T_Target ([ID] ,[Title] ,[Category]) VALUES (@ID ,@Title ,@Category) ;
INSERT INTO T_Target
([ID]
,[Title]
,[Category]) 
VALUES
(@ID
,@Title
,@Category)
;

これは、ID、Title、Categoryというカラムを持つT_Targetテーブルに、@ID、@Title、@Categoryというデータのセットを挿入するというものです。
@が付いているのでわかりづらければ、「5、タイトルあああ、カテゴリーいいい」とでもしておきましょうか。
で、これだとこのデータのセットがすでにテーブルT_Targetにあったら、重複してしまうわけですね。
これを避けたいのでMerge文を使います。

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
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]
);
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] );
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させたほうが早い気がしますが。

SQL本

楽天ウェブサービスセンター
タイトルとURLをコピーしました