Je sélectionne plusieurs lignes et les insère dans une autre table. Je veux m'assurer qu'il n'existe pas déjà dans le tableau dans lequel j'insère plusieurs lignes. DISTINCT fonctionne lorsqu'il y a des lignes en double dans la sélection, mais pas lors de la comparaison avec les données déjà dans le tableau dans lequel vous les insérez.
Si j'ai sélectionné une ligne à la fois, je pourrais faire un IF EXIST mais comme ses multiples lignes (parfois 10+) il ne semble pas que je puisse le faire.
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)
Si le distinct ne doit se trouver que sur certaines colonnes (par exemple col1, col2) mais que vous devez insérer toutes les colonnes, vous aurez probablement besoin d'une table dérivée (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)
Si vous avez déjà un index unique sur les champs qui doivent être uniques dans la table de destination, vous pouvez simplement utiliser INSERT IGNORE (voici le documentation officielle - le bit pertinent est vers la fin), et demandez à MySQL de jeter les doublons pour vous.
J'espère que cela t'aides!