複数の行を選択し、それらを別のテーブルに挿入しています。複数の行を挿入するテーブルにまだ存在していないことを確認したい。 [〜#〜] distinct [〜#〜]は、selectに重複する行がある場合に機能しますが、挿入するテーブルに既にあるデータと比較する場合には機能しません。
一度に1つの行を選択した場合、IF EXISTを実行できましたが、その複数の行(10 +以上の場合もある)があるため、それができないようです。
INSERT INTO target_table (col1, col2, col3)
SELECT DISTINCT st.col1, st.col2, st.col3
FROM source_table st
WHERE NOT EXISTS (SELECT 1
FROM target_table t2
WHERE t2.col1 = st.col1
AND t2.col2 = st.col2
AND t2.col3 = st.col3)
特定の列(col1、col2など)にのみ区別する必要があるが、すべての列を挿入する必要がある場合、おそらく派生テーブル(ANSI SQL)が必要になります。
INSERT INTO target_table (col1, col2, col3)
SELECT st.col1, st.col2, st.col3
FROM (
SELECT col1,
col2,
col3,
row_number() over (partition by col1, col2 order by col1, col2) as rn
FROM source_table
) st
WHERE st.rn = 1
AND NOT EXISTS (SELECT 1
FROM target_table t2
WHERE t2.col1 = st.col1
AND t2.col2 = st.col2)
宛先テーブルで一意である必要があるフィールドに一意のインデックスが既にある場合は、単に INSERT IGNORE (ここに 公式ドキュメント があります-関連するビットは最後)、MySQLに重複を破棄してもらいます。
お役に立てれば!