Ho due tabelle con lo stesso numero di colonne senza chiavi primarie (lo so, non è colpa mia). Ora ho bisogno di cancellare tutte le righe dalla tabella A che esiste nella tabella B (sono uguali, ognuna con 30 colonne).CANCELLA CON INTERSETTO
Il modo più immediato che ho pensato è di fare un INNER JOIN
e risolvere il mio problema. Ma, scrivere le condizioni per tutte le colonne (preoccuparsi di NULL
) non è elegante (forse anche i miei tavoli non sono eleganti).
Desidero utilizzare INTERSECT
. Non so come farlo? Questa è la mia prima domanda:
ho cercato (SQL Fiddle):
declare @A table (value int, username varchar(20))
declare @B table (value int, username varchar(20))
insert into @A values (1, 'User 1'), (2, 'User 2'), (3, 'User 3'), (4, 'User 4')
insert into @B values (2, 'User 2'), (4, 'User 4'), (5, 'User 5')
DELETE @A
FROM (SELECT * FROM @A INTERSECT SELECT * from @B) A
Ma tutte le righe sono stati cancellati dalla tabella @A
.
Questo mi ha portato alla seconda domanda: perché il comando DELETE @A FROM @B
elimina tutte le righe dalla tabella @A
?
se ricordo bene, facendo DELETE FROM A B non limita nulla, e questo normale che cancella tutto. si può limitare facendo qualcosa del tipo: CANCELLA A DA B dove A.valore = B.Valore L'aggiunta di un FROM dopo un'eliminazione è simile a un SINISTRA JOIN – Xavier
Intendevi 'DELETE A' e quello non funziona. In questo momento stai cancellando @A CROSS JOIN (qualcos'altro). Che cancella tutto se c'è almeno una riga in qualcos'altro. Guarda il piano di query per vedere questo. – usr