Discussione:
Query Delete su Due Tabelle
(troppo vecchio per rispondere)
Anza
2008-06-09 10:25:00 UTC
Permalink
Ciao a tutti ho un problema di questo genere: ho due tabelle

TAB1
Codice INT ( Primary_Key)
Nome char

e
TAB2 (identica)
Codice INT ( Primary_Key)
Nome char

trasferisco spesso dati da Tab1 a Tab2 tramite query insert select

INSERT INTO TAB2
(Codice, Nome) SELECT Codice, Nome From Tab1

Adesso devo , prima di effettuare la query di Insert cancellare in
Tab2.Codice tutti i dati presenti in Tab1.codice.

Grazie
Marcello
2008-06-09 10:32:45 UTC
Permalink
Post by Anza
Ciao a tutti ho un problema di questo genere: ho due tabelle
Ciao Anza,
Post by Anza
Adesso devo , prima di effettuare la query di Insert cancellare in
Tab2.Codice tutti i dati presenti in Tab1.codice.
Se capisco bene, puoi effettuare per esempio una chiamata del tipo:

delete Tab2
where Codice in(select Codice from Tab1)
Post by Anza
Grazie
marc.
Anza
2008-06-09 10:31:02 UTC
Permalink
Scusate

Tutti i dati Tab2.Codice = Tab1.codice.
Luca Bianchi
2008-06-09 10:58:56 UTC
Permalink
Post by Anza
Adesso devo , prima di effettuare la query di Insert cancellare in
Tab2.Codice tutti i dati presenti in Tab1.codice.
Attenzione che se ci fossero vincoli di integrità referenziale potrebbe non
essere possibile cancellare tutti i dati presenti in Tab2.
Inoltre l'attività può avere un costo non indifferente in funzione della
quantità di record da eliminare ed inserire. In questi casi sarebbe
preferibile procedere ad una operazione di allineamento solo delle
differenze attraverso una triplice operazione di DELETE+UPDATE+INSERT in
maniera simile a

--eliminazione dei record non più presenti
DELETE dbo.Destinazione
WHERE PK NOT IN (SELECT PK FROM dbo.Origine)

--aggiornamento dei record modificati
UPDATE
SET campo1 = O.campo1,
campo2 = O.campo2,
...,
campon = O.campon
FROM dbo.Origine O INNER JOIN dbo.Destinazione D
ON O.PK = D.PK
WHERE campo1 <> O.campo1
OR campo2 = O.campo2
OR ...
OR campon = O.campon

--inserimento dei nuovi
INSERT dbo.Destinazione
SELECT O.*
FROM dbo.Origine O LEFT JOIN dbo.Destinazione D
ON O.PK = D.PK
WHERE D.PK IS NULL

Tutto questo in attesa dell'operatore MERGE (SQL Server 2008)...
Post by Anza
Grazie
Bye
--
Luca Bianchi
Microsoft MVP - SQL Server
http://community.ugiss.org/blogs/lbianchi
Continua a leggere su narkive:
Loading...