2011-05-06 12 views
15

Sto selezionando più righe e inserendole in un'altra tabella. Voglio assicurarmi che non esista già nella tabella in cui sto inserendo più righe in. DISTINCT funziona quando ci sono righe duplicate nella selezione, ma non quando lo si confronta con i dati già presenti nella tabella in cui si inseriscono.sql inserire nella tabella da select senza duplicati (serve più di un DISTINCT)

Se selezionassi una riga alla volta potrei fare un SE ESISTE ma dal momento che le sue righe multiple (a volte 10+) non mi sembra possibile.

+1

Fornire la query che si desidera utilizzare. E il database aiuterebbe anche. –

+1

Se il tuo DBMS supporta l'istruzione MERGE che potrebbe essere una soluzione –

risposta

-1

ci sono un paio di articoli di MSDN là fuori su questo, ma di gran lunga questo è il migliore:

http://msdn.microsoft.com/en-us/library/ms162773.aspx

hanno reso reale facile da implementare e il mio problema è stato corretto. Anche la GUI è brutta, ma in realtà è possibile impostare intervalli minuti senza utilizzare la riga di comando in Windows 2003.

-1

Quindi stai cercando di recuperare tutte le righe univoche dalla tabella di origine che non esistono già nella tabella di destinazione?

SELECT DISTINCT(*) FROM source 
WHERE primaryKey NOT IN (SELECT primaryKey FROM target) 

Che si sta assumendo avere una chiave primaria che è possibile basare l'unicità sul ... in caso contrario, si dovrà controllare ogni colonna per unicità.

-1

pseudo codice per che cosa potrebbe funzionare

insert into <target_table> select col1 etc 
from <source_table> 
where <target_table>.keycol not in 
(select source_table.keycol from source_table) 
20
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) 

Se la distinta dovrebbe essere solo su alcune colonne (ad esempio col1, col2) ma è necessario inserire tutte le colonne, si avrà probabilmente bisogno di qualche tabella derivata (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) 
+0

Probabilmente sarà la migliore risposta – vol7ron

2

Se si dispone già di un indice univoco su qualunque campi devono essere univoci nella tabella di destinazione, si può semplicemente utilizzare INSERT IGNORE (ecco il official documentation - il bit pertinente è verso la fine) e MySQL getta via i duplicati per te.

Spero che questo aiuti!

+0

Quando ho provato a fare "INSERIRE ... SELECT DISTINCT" in MySQL, ho ricevuto l'errore "Colonna sconosciuta" DISTINCT "in" lista dei campi '". Tuttavia, "INSERT IGNORE" ha avuto successo, anche se un po 'più lento di "INSERT ... SELECT DISTINCT" sarebbe stato. – Mikkel

Problemi correlati