ホームページ >データベース >mysql チュートリアル >SQL Server の INSERT INTO SELECT を使用してデータを挿入するときに重複を効率的に回避するにはどうすればよいですか?
SQL Server: INSERT INTO SELECT
SQL Server のあるテーブルから別のテーブルにデータを挿入するには、エントリの重複を避けるために慎重に検討する必要があります。 これは、宛先テーブルに競合する可能性のあるデータがすでに含まれている場合に重要です。次の例を考えてみましょう:
<code>Table1 ---------- ID Name 1 A 2 B 3 C Table2 ---------- ID Name 1 Z</code>
単純な INSERT INTO SELECT
は、ID
が重複しているため失敗します (1)。 条件付き IF-ELSE
ステートメントは可能ですが、非効率的で面倒です。 より効率的な代替手段が存在します:
方法 1: NOT EXISTS
これは一般的に最も効率的なアプローチです:
<code class="language-sql">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);</code>
Table1
に ID
が存在しない行のみが Table2
から挿入されます。
方法 2: NOT IN
このメソッドは、選択プロセス中に重複をフィルターします:
<code class="language-sql">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);</code>
このアプローチは、特に大規模なデータセットの場合、NOT EXISTS
よりも効率が低くなります。
方法 3: LEFT JOIN
と IS NULL
これは通常、最も効率の悪い方法です:
<code class="language-sql">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;</code>
A LEFT JOIN
は一致しない行を識別します。 NULL
に Table2.id
値を持つもののみが挿入されます。
特に大規模なデータセットで最適なパフォーマンスを得るには、NOT EXISTS
メソッドをお勧めします。 他の要因により推奨されない限り、LEFT JOIN
アプローチは避けてください。 特定のニーズとデータセットのサイズに最適な方法を選択してください。
以上がSQL Server の INSERT INTO SELECT を使用してデータを挿入するときに重複を効率的に回避するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。