PDA

View Full Version : [MS SQL] Insert senza duplicati


exyana
13-06-2008, 09:32
Mi servirebbe fare una insert da una tabella A in un'altra B evitando però di inserire le righe già presenti in B.

A priori non conosco la chiave di B e quindi non posso fare una cosa tipo:
INSERT INTO B
SELECT * FROM A WHERE NOT EXISTS
(...)

esiste invece un comando specifico di MS Sql Server per non inserire duplicati?
(penso a qualcosa tipo IGNORE_DUP_KEY della bulk)

nuovoUtente86
13-06-2008, 14:22
Scusa, ma alla fine gli inserimenti sono protetti dalla chiave primaria della tabella ricevente. Essendo il compito della chiave di imperdire la presenza di ambiguità, sul quel campo non avrai problemi e del resto sugli altri ( a meno degli Unique) accettare i diplucati è nell' ordine delle cose.

exyana
14-06-2008, 12:26
Scusa, ma alla fine gli inserimenti sono protetti dalla chiave primaria della tabella ricevente. Essendo il compito della chiave di imperdire la presenza di ambiguità, sul quel campo non avrai problemi e del resto sugli altri ( a meno degli Unique) accettare i diplucati è nell' ordine delle cose.
sì ma in pratica quello che vorrei è che vengano copiate in B solo le righe di A che non hanno la stessa chiave di qualcosa che è già contenuto in B, però tieni presente che non conosco la chiave di B.

nuovoUtente86
14-06-2008, 14:58
cerca di fare un esempio pratico di quello che vorresti, con 2 semplicissime tabelle.

exyana
15-06-2008, 12:10
Tabella A:
campoA: campoB:
valoreA1 valoreB1
valoreA2 valoreB2


Tabella B:
campoA: campoB:
valoreA1 valoreB4
valoreA3 valoreB3


ponendo che la chiave della tabella B sia data dal campoA, ma che io non sappia a priori che il campoA è chiave,
vorrei che venisse copiata da A a B solo la tupla valoreA2 valoreB2.

ovviamente se sapessi a priori che campoA è chiave potrei fare questa query:
insert into B
select * from A where
campoA not in (select campoA from B)

edit:
Per maggiore chiarezza, utilizzassi MySql, da quello che ho capito,
basterebbe utilizzare la parola chiave ignore, cioè sarebbe:
insert ignore into B
select * from A

in questo modo, ad ogni riga con la stessa chiave sarebbe restituito solo un warning, ma lo statement non sarebbe abortito.
esiste un comando simile in MS Sql?