web-dev-qa-db-ja.com

重複なしのselectからのテーブルへのsql挿入(DISTINCT以上が必要)

複数の行を選択し、それらを別のテーブルに挿入しています。複数の行を挿入するテーブルにまだ存在していないことを確認したい。 [〜#〜] distinct [〜#〜]は、selectに重複する行がある場合に機能しますが、挿入するテーブルに既にあるデータと比較する場合には機能しません。

一度に1つの行を選択した場合、IF EXISTを実行できましたが、その複数の行(10 +以上の場合もある)があるため、それができないようです。

15
tdjfdjdj
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)
27

宛先テーブルで一意である必要があるフィールドに一意のインデックスが既にある場合は、単に INSERT IGNORE (ここに 公式ドキュメント があります-関連するビットは最後)、MySQLに重複を破棄してもらいます。

お役に立てれば!

2
Xavier Holt