web-dev-qa-db-fra.com

sql insérer dans le tableau de sélectionner sans doublons (besoin de plus d'un DISTINCT)

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.

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)

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

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!

2
Xavier Holt