View Full Version : [SQL] Query di aggiornamento+accodamento: si può fare?
Bizkaiko
14-03-2008, 10:15
Esiste in SQL la possibilità di creare una query che sia al tempo stesso di aggiornamento per i dati già presenti in una tabella, e di accodamento per quelli che invece non esistono?
Per ora ho risolto così:
1) mi creo una tabella temporanea in cui copio tutti gli articoli che mi servono dalla tabella A.
2) faccio partire una query che aggiorni i dati nella tabella B se ci sono corrispondenze con quelli della tabella TEMP
3) elimino le righe corrispondenti dalla tabella TEMP
4) accodo le righe rimanenti nella tabella B
5) elimino la tabella TEMP
Però è un procedimento macchinoso, se ci fosse la possibilità di creare la query (così come c'è in Access!!!) mi risparmierebbe tutti questi passaggi.
Bizkaiko
17-03-2008, 10:19
Uppettino!
amedeoviscido
17-03-2008, 10:40
Se la tabella temporanea contiene tutti i campi a te necessari, potresti più facilmente cancellare dalla tabella i dati già esistenti e poi ricaricare tutto, ma questo solo se i campi ci sono tutti!
purtroppo farò sql solo il prossimo anno :P
però... se sai come crearla in access, ti consiglio di crearla li, visualizzare il codice e convertirlo in sql standard con uno dei tanti convertitori di codice presenti in rete... mai provato ma... tentar non nuoce no? :cool:
se ti puo essere utile:
http://www.fonlow.com/zijianhuang/dbconverter/
L'istruzione che cerchi e' un'istruzione SQL standard dalla versione SQL2003, che non e' stata recepita da tutti i motori SQL.
L'istruzione dovrebbe chiamarsi UPSERT (una istruzione come SELECT, UPDATE, DELETE per intenderci)
ma p.es. Oracle l'ha chiamata MERGE (e' stata messa li' prima del 2003)
Quindi il poterlo fare nativamente dipende dal motore che stai utilizzando.
Altrimenti puoi sempre usare il seguente costrutto:
Da preferirsi quando si e' alla ricerca di velocita'.
per ciascun record
UPDATE
if no row updated
INSERT
Il precedente costrutto soffre di problemi di concorrenza, anche in presenza di transazioni e con database robusti che implementano correttamente le caratteristiche ACID.
Anche in presenza di transazioni ACIDe infatti 2 processi possono entrambi superare contemporaneamente lo statement UPDATE, per trovarsi contemporaneamente ad eseguire la INSERT, che funzionerebbe per la prima e fallirebbe per la seconda.
Il seguente invece e' lento, ma non soffre della concorrenza
per ciascun record
INSERT
if dup_val_on_index (primary key violata)
UPDATE
Pertanto e' da preferirsi. Lo scotto da pagare e' che la violazione di chiave e la conseguente eccezione sono tipicamente molto lente. Non per nulla e' stata richiesta ed accettata la UPSERT.
Bizkaiko
17-03-2008, 14:27
L'istruzione che cerchi e' un'istruzione SQL standard dalla versione SQL2003, che non e' stata recepita da tutti i motori SQL.
L'istruzione dovrebbe chiamarsi UPSERT (una istruzione come SELECT, UPDATE, DELETE per intenderci)
ma p.es. Oracle l'ha chiamata MERGE (e' stata messa li' prima del 2003)
Quindi il poterlo fare nativamente dipende dal motore che stai utilizzando.
Altrimenti puoi sempre usare il seguente costrutto:
Da preferirsi quando si e' alla ricerca di velocita'.
per ciascun record
UPDATE
if no row updated
INSERT
Il precedente costrutto soffre di problemi di concorrenza, anche in presenza di transazioni e con database robusti che implementano correttamente le caratteristiche ACID.
Anche in presenza di transazioni ACIDe infatti 2 processi possono entrambi superare contemporaneamente lo statement UPDATE, per trovarsi contemporaneamente ad eseguire la INSERT, che funzionerebbe per la prima e fallirebbe per la seconda.
Il seguente invece e' lento, ma non soffre della concorrenza
per ciascun record
INSERT
if dup_val_on_index (primary key violata)
UPDATE
Pertanto e' da preferirsi. Lo scotto da pagare e' che la violazione di chiave e la conseguente eccezione sono tipicamente molto lente. Non per nulla e' stata richiesta ed accettata la UPSERT.
Grazie mille, adesso provo a darci un'occhiata!
Bizkaiko
17-03-2008, 14:29
Se la tabella temporanea contiene tutti i campi a te necessari, potresti più facilmente cancellare dalla tabella i dati già esistenti e poi ricaricare tutto, ma questo solo se i campi ci sono tutti!
Si, in effetti così risparmierei 1 passaggio, grazie :)
Bizkaiko
17-03-2008, 14:30
purtroppo farò sql solo il prossimo anno :P
però... se sai come crearla in access, ti consiglio di crearla li, visualizzare il codice e convertirlo in sql standard con uno dei tanti convertitori di codice presenti in rete... mai provato ma... tentar non nuoce no? :cool:
se ti puo essere utile:
http://www.fonlow.com/zijianhuang/dbconverter/
Proverò anche questa, grazie! :)
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.