[ORACLE] Merge

lunedì 23 febbraio 2009 - 10.32

liveforever81 Profilo | Junior Member

Salve a tutti.

Ho la necessità di aggiornare un campo di una tabella solo se è soddisfatta una condizione, in caso contrario devo effettuare una insert.

In pratica se è GIA' PRESENTE la riga nella tabella, faccio l'update di un suo campo, altrimenti faccio la insert.

Mi hanno parlato di questo comando MERGE, il cui funzionamento mi è chiaro fino ad un certo punto: come posso adattarlo nel caso in cui ho 1 sola tabella?

Es.

La mia tabella ha 3 colonne (id, nome, oraInserimento).
La mia query deve controllare se l'id in ingresso è già presente -> se così fosse fa l'update altrimenti la insert.

MERGE INTO <nomeTabella>
USING (<Qui faccio la Select * sulla tabella> -> *devo inserire anche la condizione??*)
ON (<Qui non ho idea di cosa mettere>)
WHEN MATCHED THEN <Update>
WHEN NOT MATCHED THEN <Insert>

I passaggi oscuri sono la USING e la ON...chi ne sa di più?
Grazie!

lbenaglia Profilo | Guru

>USING (<Qui faccio la Select * sulla tabella> -> *devo
>inserire anche la condizione??*)
Se devi filtrare i dati della tabella di origine tramite una clausola WHERE, allora inserisci anche la condizione.

>ON (<Qui non ho idea di cosa mettere>)
Qui devi mettere la condizione di JOIN tra la tabella di destinazione e quella di origine (tipo Destinazione.ID = Origine.ID).

>Grazie!
Prego.

Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org

liveforever81 Profilo | Junior Member

Ciao è grazie della celerità! :)

Non devo filtrare, ma solo effettuare un controllo su 1 sola tabella (non su 2): a questo punto nella USING faccio una SELECT * -suppongo senza WHERE, giusto?-.

Ho letto poi della clausola DUAL da usare quando la tabella è singola: cosa devo mettere, quindi, nella clausola ON?

Grazie mille

lbenaglia Profilo | Guru

>Non devo filtrare, ma solo effettuare un controllo su 1 sola
>tabella (non su 2): a questo punto nella USING faccio una SELECT
>* -suppongo senza WHERE, giusto?-.
Cosa intendi con "effettuare un controllo su 1 sola tabella"?
Se non devi mettere filtri puoi scrivere SELECT * FROM tabella oppure semplicemente il nome della tabella.

>Ho letto poi della clausola DUAL da usare quando la tabella è
>singola: cosa devo mettere, quindi, nella clausola ON?
Lascia perdere DUAL, ti serve solo quando vuoi leggere un valore scalare:
http://www.adp-gmbh.ch/ora/misc/dual.html

Come ho già scritto, nella clausola ON devi mettere la condizione di JOIN che ti permette di stabilire una correlazione tra la tabella di destinazione e quella di origine: se la condizione è soddisfatta significa che la riga esiste, altrimenti no.

>Grazie mille
Prego.

Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org

liveforever81 Profilo | Junior Member

Allora, provo ad entrare nel particolare così da essere più esaustivo:

Ho questa tabella:

nome: User
Colonne: Id, Name, InsertDate

In input, a runtime, mi arriva una stringa (chiamata Identificativo): la MERGE mi serve perchè devo controllare se questo Id è già presente nella Tabella User o meno: se è presente faccio l'update della colonna InsertDate, altrimenti aggiungo una nuova riga;

Esempio

MERGE INTO User
USING (SELECT * FROM User)
ON (Identificativo = Id)
WHEN MATCHED THEN
UPDATE SET InsertDate = SYSDATE
WHEN NOT MATCHED THEN
INSERT (Id, Name, InsertDate)
VALUES (Identificativo, "Pippo", SYSDATE")

E' corretto (in particolare la USING e la ON)?

Grazie

lbenaglia Profilo | Guru

>Allora, provo ad entrare nel particolare così da essere più esaustivo:
>
>Ho questa tabella:
>
>nome: User
>Colonne: Id, Name, InsertDate
>
>In input, a runtime, mi arriva una stringa (chiamata Identificativo):
>la MERGE mi serve perchè devo controllare se questo Id è già
>presente nella Tabella User o meno: se è presente faccio l'update
>della colonna InsertDate, altrimenti aggiungo una nuova riga;
>
>Esempio
>
>MERGE INTO User
>USING (SELECT * FROM User)

La tabella di origine e quella di destinazione ovviamente NON possono coincidere
Poi non avevo capito che la tabella di origine in realtà è una variabile scalare e non una tabella.
In questo caso prova a modificare il comando nel seguente modo:

MERGE INTO User USING (SELECT Identificativo FROM DUAL) ON (Identificativo = Id) WHEN MATCHED THEN UPDATE SET InsertDate = SYSDATE WHEN NOT MATCHED THEN INSERT (Id, Name, InsertDate) VALUES (Identificativo, 'Pippo', SYSDATE");

>Grazie
Prego.

Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org

liveforever81 Profilo | Junior Member

Grazie...lo provo subito!

;)
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2024
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5