私は2つのテーブルを持っています。user
には古いデータが含まれていますuser_new
。user
これuser_new
には新しいデータが含まれます。に同期しuser_new
たいuser
。
- データが に存在し
user_new
、存在しない場合はuser
、 に挿入しuser
ます。 - データが
user
とに存在する場合はuser_new
、更新します (列 と比較してくださいid
) 。
それを行うための高速なSQLは何ですか?
私は2つのテーブルを持っています。user
には古いデータが含まれていますuser_new
。user
これuser_new
には新しいデータが含まれます。に同期しuser_new
たいuser
。
user_new
、存在しない場合はuser
、 に挿入しuser
ます。user
とに存在する場合はuser_new
、更新します (列 と比較してくださいid
) 。それを行うための高速なSQLは何ですか?
これはどのサーバーバージョンでも機能します-
-- 1) Insert new record
INSERT INTO old_table(id, column)
SELECT n.id, n.column
FROM new_table n
LEFT JOIN old_table o ON n.id = o.id
WHERE o.id IS NULL
-- 2) Update existed record
UPDATE o
SET column = n.column
FROM old_table o
JOIN new_table n ON n.id = o.id
Sql Server 2008 以降では、Merge
構文 を使用できます
MERGE user target
USING user_new source
ON taget.ID = source.ID
WHEN MATCHED THEN
UPDATE
SET target.Column= source.Column1,target.column2=source.column2
WHEN NOT MATCHED BY TARGET THEN
INSERT (ID,Column1,Column2)
VALUES (source.ID,source.column1,source.column2);
または、以下のクエリを使用できます
INSERT INTO user(ID,column1,column2)
SELECT ID,column1,column2 FROM user_new AS source
WHERE NOT EXISTS (SELECT * FROM user WHERE ID = source.ID);
UPDATE target SET ...
FROM user AS target
INNER JOIN user_new AS source
ON target.ID = source.ID;
あなたはできませんinsert
しupdate
、単一のクエリでは別々に行う必要があります
select * from user where user_id not in (select user_new.user_id from user_new )
このクエリは、同様に挿入クエリのデータを生成します。置換not in
して更新する必要がありますin
SQL Server 2008 以降を使用している場合、 Mergeが必要になるようです。