重複を避けながらテーブルに行をコピーする
目標は、あるテーブル (srcTable) から別のテーブル (destTable) にすべての行を転送することです。 、重複したエントリは除きます。重複を除外するサブクエリで WHERE 句を追加するのは簡単そうに見えますが、このアプローチは失敗する可能性があります。
サブクエリの問題:
元のクエリは次のとおりです。 :
INSERT INTO destTable SELECT * FROM srcTable WHERE NOT EXISTS(SELECT * FROM destTable)
ただし、サブクエリはすべての行を返すため、このクエリは行を挿入しません。 destTable。srcTable 内の行と一致するかどうかは関係ありません。サブクエリを機能させるには、関連フィールドに基づいて重複行を識別するための追加条件を含める必要があります。
改訂されたサブクエリ:
INSERT INTO destTable SELECT Field1, Field2, Field3, ... FROM srcTable WHERE NOT EXISTS(SELECT * FROM destTable WHERE (srcTable.Field1 = DestTable.Field1 AND srcTable.Field2 = DestTable.Field2 ... etc.))
この改訂されたサブクエリは、特定の内容を比較します。フィールドを使用して重複を特定し、挿入から除外します。
外部結合代替:
別のアプローチは、外部結合を使用することです:
INSERT INTO destTable SELECT s.field1, s.field2, s.field3,... FROM srcTable s LEFT JOIN destTable d ON (d.Key1 = s.Key1 AND d.Key2 = s.Key2 AND...) WHERE d.Key1 IS NULL
この外部結合手法では、destTable に一致するキーを持つ srcTable の行がフィルターで除外され、挿入中に重複が除外されます。 .
ソーステーブルのアドレス指定重複:
sourceTable に重複行が含まれていることが懸念される場合は、個別の行を選択するようにクエリを変更する必要があります:
INSERT INTO destTable SELECT DISTINCT Field1, Field2, Field3,... FROM srcTable
INSERT ステートメントに特定のフィールド名を含めることをお勧めしますSELECT *.
を使用するよりも以上が重複を避けながらあるテーブルから別のテーブルに行をコピーするにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。