次の2つのテーブルがあります。
Table1
----------
ID Name
1 A
2 B
3 C
Table2
----------
ID Name
1 Z
Table1
からTable2
にデータを挿入する必要があります。次の構文を使用できます。
INSERT INTO Table2(Id, Name) SELECT Id, Name FROM Table1
ただし、私の場合、Table2
に重複するIDが存在する可能性があり(私の場合は、単に "1
")、エラーをスローするため、再度コピーすることは望ましくありません。
私はこのようなものを書くことができます:
IF NOT EXISTS(SELECT 1 FROM Table2 WHERE Id=1)
INSERT INTO Table2 (Id, name) SELECT Id, name FROM Table1
ELSE
INSERT INTO Table2 (Id, name) SELECT Id, name FROM Table1 WHERE Table1.Id<>1
IF - ELSE
を使用せずにこれを行うより良い方法はありますか?何らかの条件に基づいて、2つのINSERT INTO-SELECT
ステートメントを避けたい。
NOT EXISTS
の使用:
INSERT INTO TABLE_2
(id, name)
SELECT t1.id,
t1.name
FROM TABLE_1 t1
WHERE NOT EXISTS(SELECT id
FROM TABLE_2 t2
WHERE t2.id = t1.id)
NOT IN
の使用:
INSERT INTO TABLE_2
(id, name)
SELECT t1.id,
t1.name
FROM TABLE_1 t1
WHERE t1.id NOT IN (SELECT id
FROM TABLE_2)
LEFT JOIN/IS NULL
の使用:
INSERT INTO TABLE_2
(id, name)
SELECT t1.id,
t1.name
FROM TABLE_1 t1
LEFT JOIN TABLE_2 t2 ON t2.id = t1.id
WHERE t2.id IS NULL
3つのオプションのうち、LEFT JOIN/IS NULL
はあまり効率的ではありません。 詳細についてはこのリンク を参照してください。
MySQLではこれを行うことができます。
INSERT IGNORE INTO Table2(Id, Name) SELECT Id, Name FROM Table1
SQL Serverには同様のものがありますか?
同様の問題がありました。DISTINCTキーワードは魔法のように機能します。
INSERT INTO Table2(Id, Name) SELECT DISTINCT Id, Name FROM Table1
一意のインデックスでignore Duplicates
を使用する ここでIanCが提案したように は、オプションWITH IGNORE_DUP_KEY
を使用してインデックスを作成する同様の問題の解決策でした
In backward compatible syntax
, WITH IGNORE_DUP_KEY is equivalent to WITH IGNORE_DUP_KEY = ON.
参照: index_option
私は最近同じ問題に直面していました...
ここに、MS SQL Server 2017でうまくいったものがあります...
主キーは、表2のIDに設定する必要があります...
列と列のプロパティは、両方のテーブル間で同じでなければなりません。これは、以下のスクリプトを初めて実行するときに機能します。表1の重複IDは挿入されません...
2回目に実行すると、
PRIMARY KEY制約エラーの違反
これはコードです:
Insert into Table_2
Select distinct *
from Table_1
where table_1.ID >1
DELETE
の前の単純なINSERT
で十分です。
DELETE FROM Table2 WHERE Id = (SELECT Id FROM Table1)
INSERT INTO Table2 (Id, name) SELECT Id, name FROM Table1
保持するテーブルのId
とname
のペアに応じて、Table1
をTable2
に切り替えます。
少し外れたトピックですが、データを新しいテーブルに移行したい場合、可能性のある重複が元のテーブルにあり、重複している可能性のある列がIDではない場合、GROUP BY
でできます:
INSERT INTO TABLE_2
(name)
SELECT t1.name
FROM TABLE_1 t1
GROUP BY t1.name