PDA

Visualizza la versione completa : [SQL] Delete Complesso


Markho
10-04-2003, 11:03
Premessa
2 tabelle: tab1 e tab2

campi:
tab1: tab1_campo1 e tab1_campo2
tab2: tab2_campo1 e tab2_campo2

su tab1 ho 3 record, su tab2 ho, oltre ai 3 record di tab1 altri 4 record in +, ok?

Obiettivo:
sto cercando di fare in modo, con un SQL, di cancellare dalla tab2 i record che ha in + rispetto alla tab1 senza fare degli update strani, solo un delete secco,

vi sentite in grado di darmi una mano? :D

ty

darkblOOd
10-04-2003, 11:08
DELETE * FROM Tab2 Left Join Tab1 On Tab1.Campo1 <> Tab2.Campo1 AND Tab1.Campo2 <> Tab2.Campo2


non l'ho provato (qualche riserva sul left della join) però dovrebbe andare :ciauz:

dieghito101
10-04-2003, 11:12
non mi e' chiarissimo il tuo problema, ma ..

non potresti fare una LEFT JOIN e poi cancellare quelli dove la Join falisce?

Es:
DELETE tab2
FROM tab2 LEFT JOIN tab1 ON tab2.campo1 = tab1.campo1 AND tab2.campo2 = tab1.campo2
where tab1.campo1 IS NULL AND tab1.campo2 IS NULL

non l'ho provato .. pero' una cosa del genere dovrebbe andare..

robyemme
10-04-2003, 11:12
devi fare così :

delete tab2
from tab1 t1, tab2 t2
where t1.tab1_campo1 = t2.tab2_campo1 and
t1.tab1_campo2 = t2.tab2_campo2

note :
(1) t1 e t2 sono gli 'alias' delle tabelle,servono,in caso di nomi di campo uguali, ad indicare da quale tabella considerare il campo stesso.
(2) i campi considerati nella "where" devono essere la chiave di corrispondenza tra i records delle due tabelle (p.es. un codice cliente, un codice articolo, un cap.......)
ciao.

dieghito101
10-04-2003, 11:15
ciao darkblOOd
... ho paura che il DELETE * FROM dia dei problemi ...

devi specificare tab2 ...

darkblOOd
10-04-2003, 11:17
Originariamente inviato da dieghito101
ciao darkblOOd
... ho paura che il DELETE * FROM dia dei problemi ...

devi specificare tab2 ...
infatti :stordita:

cmq per risolvere dovrebbe fare una join che restituisce i valori uguali e cancellarli

dieghito101
10-04-2003, 11:23
ma lui non deve mica cancellare quelli diversi?

io faccio la left join, tab1 mi restituira' null su quelli non corrispondenti e io cancello quelli...

darkblOOd
10-04-2003, 11:28
ecco, questa ti lascia in tab2 i valori che NON esistono in tab1, cioè quelli in +


delete tab2 from
(select tab2.campo1,tab2.campo2
from tab2
left join tab1 on tab1.campo1 = tab2.campo1 and tab1.campo2 = tab2.campo2
where tab1.campo1 is not null and tab1.campo2 is not null) as t1
where t1.campo1=tab2.campo1 and t1.campo2 = tab2.campo2



è quello che cercavi? :stordita:

darkblOOd
10-04-2003, 11:29
ah, lui deve cancellare quelli in + .....allora devi cambiare lo script che ho appena postato e includere nella join quelli null

(praticamente devi togliere il NOT prima delle due parole chiave NULL)
:ciauz:

Markho
10-04-2003, 11:32
calma un attimo, io devo cancellare quelli diversi, adesso provo le vostre soluzioni, poi v faccio sapere

Loading