Discussione:
query di update simil inner join
(troppo vecchio per rispondere)
Mizio
2007-11-26 09:55:25 UTC
Permalink
Ciao a tutti e buon inizio settimana.
Capisco che l'oggetto del mio posto dice poco su quanto vorrei realizzare,
ed allora vado a spigare meglio che posso.
Premetto che lavoro in Ado, VB6 e sql2000.
Per fare un update di alcuni (tanti) record di una tabella, oltre che
"chiedere" un recordset ad ado, possiamo usare il metodo Execute della
connessione e fare un update, es.:

Update Tabella Set Campo = 'Ciao' where Campo = 'Bye'

e fin qui, tutto ok.

Una cosa un po' piu' complessa, ed e' quello su cui vorrei avere
informazioni, e' la possibilita' di aggiornare dei record in base ad una
clausola Where soddisfatta in un'altra tabella.
Cerco di fare un esempio.
Abbiamo due tabelle, una con degli articoli (IdArticolo, Descrizione) ed una
con dei dettagli fattura (IdArticolo, Prezzo).

Vorrei poter aggiornare il prezzo nella tabella Dettagli per tutti i
dettagli articoli che si chiamano (quindi nella descrizione) Secchio.

Per poter tirare fuori il recordset come serve a me, in una select, farei:
Select * from Articoli Inner Join Dettagli where Articoli.Descrizione =
'Secchio'
Ora, a parte il fatto che normalmente il prezzo probabilmente si troverebbe
nella tabella degli articoli, e che in questo caso specifico forse sarebbe
piu' logico leggere l'id dell'articolo e fare un update sulla tabella
Dettagli usando l'id stesso, come si puo' tradurre cio' che mi serve in un
comando update?
Vorrei fare un update in una tabella dove i dati che mi servono sono
spalmati su altre due tabelle, e vorrei evitare di scorrere record per
record il recordset risultante dai due inner join e aggiornare "a mano" ogni
record.
Chi mi aiuta?
Grazie a tutti... Maurizio
Mizio
2007-11-26 11:06:07 UTC
Permalink
Vabbe' ho scritto un casino:
...
Post by Mizio
Select * from Articoli Inner Join Dettagli where Articoli.Descrizione =
'Secchio'
...
sarebbe
Select * From Articoli Inner Join Dettagli On Articoli.IdArticolo =
Dettagli.IdArticolo Where Articoli.Descrizione = 'Secchio'

Nel caso dell'Update, da quel che ho capito, basta sostituire il select con
l'update e il nome del campo da sostituire

UPDATE Dettagli
SET Prezzo = 2000
FROM Dettagli INNER JOIN
Articoli ON Dettagli.IdArticolo = Articoli.IdArticolo
WHERE Articoli.Descirzione = 'Secchio'

forse ci siamo. Ciao e grazie... Maurizio
Andrea [Work]
2007-11-26 11:15:42 UTC
Permalink
Post by Mizio
UPDATE Dettagli
SET Prezzo = Articoli.PrezzoBase
FROM Dettagli INNER JOIN
Articoli ON Dettagli.IdArticolo = Articoli.IdArticolo
WHERE Articoli.Descirzione = 'Secchio'
forse ci siamo. Ciao e grazie... Maurizio
Io farei così se è supportata.
Se togli la Where aggiorni tutto a catena (a parte che una where in quel
modo non è certo sicura).

Dovrebbe essere così la sintassi, non la posso provare perchè firebird non
la supporta.
Mizio
2007-11-26 11:22:12 UTC
Permalink
Ciao Andrea
...
Post by Andrea [Work]
Io farei così se è supportata.
Se togli la Where aggiorni tutto a catena
...
Scusa, non ho capito.
Togliendo la Where, mi aggiornerebbe tutti i prezzi della tabella Dettagli,
e non solo quelli la cui descrizione e' 'Secchio'
...
(a parte che una where in quel
Post by Andrea [Work]
modo non è certo sicura).
...
Uhm, e perche'?
Ciao e grazie... Maurizio
Andrea [Work]
2007-11-26 15:27:57 UTC
Permalink
Post by Mizio
...
Scusa, non ho capito.
Togliendo la Where, mi aggiornerebbe tutti i prezzi della tabella Dettagli,
e non solo quelli la cui descrizione e' 'Secchio'
...
Si, se devi aggiornare tutti i prezzi. Altrimenti lascia la where
Post by Mizio
(a parte che una where in quel
Post by Andrea [Work]
modo non è certo sicura).
...
Uhm, e perche'?
Se nella descrizione uno ha scritto "secchio" o "SEcchio" o "Secchi0" ?
Se si sicuro di cosa c'è scritto allora va bene...
Andrea Montanari
2007-11-27 11:50:21 UTC
Permalink
Salve,
Post by Andrea [Work]
Post by Mizio
...
Scusa, non ho capito.
Togliendo la Where, mi aggiornerebbe tutti i prezzi della tabella
Dettagli, e non solo quelli la cui descrizione e' 'Secchio'
...
Si, se devi aggiornare tutti i prezzi. Altrimenti lascia la where
Post by Mizio
(a parte che una where in quel
Post by Andrea [Work]
modo non è certo sicura).
...
Uhm, e perche'?
Se nella descrizione uno ha scritto "secchio" o "SEcchio" o "Secchi0"
? Se si sicuro di cosa c'è scritto allora va bene...
Firebird infatti non mi pare supporti la sintassi proprietaria di Microsoft
SQL Server, UPDATE .. FROM.. (anzi, Andrea, prima o poi ti chiamo
privatamente, se mi dai indirizzo in tal senso, relativamente a Firebird
:) )
comunque tieni presente che solitamente le collation utilizzate in SQL
Server sono case insensitive, ed il problema da te indicato, comune in
Firebird, puo' eventualmente essere risolto con un UPPER(colonna) =
UPPER(@parametro) :)
saluti
--
Andrea Montanari (Microsoft MVP - SQL Server)
http://www.asql.biz http://italy.mvps.org
DbaMgr2k ver 0.21.0 - DbaMgr ver 0.65.0 and further SQL Tools
--------- remove DMO to reply
Andrea [Work]
2007-11-28 09:14:26 UTC
Permalink
Post by Andrea Montanari
Firebird infatti non mi pare supporti la sintassi proprietaria di Microsoft
SQL Server, UPDATE .. FROM.. (anzi, Andrea, prima o poi ti chiamo
privatamente, se mi dai indirizzo in tal senso, relativamente a Firebird
:) )
Se è una cosa relativa a firebird, potremo discuterne sul NG
it.comp.software.database, che male non fa alla memoria di google.
Altrimenti dimmi te, che ti mando una mail.
Post by Andrea Montanari
comunque tieni presente che solitamente le collation utilizzate in SQL
Server sono case insensitive, ed il problema da te indicato, comune in
Firebird, puo' eventualmente essere risolto con un UPPER(colonna) =
Bhe sicuramente, ma bisogna vedere da chi è stata scritta la descrizione.
Se è stata imputata dall'utente, non si ha idea di cosa possano scrivere,
se poi è una cosa manuale da fare su un archivio una tantum, basta
verificare che dati ci sono e lanciare la query che ha scritto :)
Andrea Montanari
2007-11-28 11:01:51 UTC
Permalink
salve Andrea,
Post by Andrea [Work]
Post by Andrea Montanari
Firebird infatti non mi pare supporti la sintassi proprietaria di
Microsoft SQL Server, UPDATE .. FROM.. (anzi, Andrea, prima o poi ti
chiamo privatamente, se mi dai indirizzo in tal senso, relativamente
a Firebird :) )
Se è una cosa relativa a firebird, potremo discuterne sul NG
it.comp.software.database, che male non fa alla memoria di google.
Altrimenti dimmi te, che ti mando una mail.
<OT>
sto valutando Firebird per un applicativo dove SQLExpress non e' gradito..
ho scaricato e sto giochicchiando con la 2.0.3 in Vb2005 con il
FirebirdClient for .Net 2.0.. l'ambito sarebbe in modalita' Superserver.. la
piattaforma, in generale, non mi dispiace...
la problematica che non "risolvo" a livello mentale (sono parecchio
indietro, eh?) sarebbe relativo a come "distacchi" i database in Firebird,
similarmente a sp_detach_db di SQL Server.. sia per smontare un db per
copia, che la gestione applicativa/interattiva di backup/restore.. mi sono
letto http://www.compman.co.uk/scripts/browse.asp?ref=638130 con
l'integrazione (pdf) per la V2, ed a tale proposito nulla e' indicato.. ho
solo trovato un warning via Google relativo ad essere "darn sure" ( :) ) che
il database non sia in uso, ne' interattivamente da parte di altri utenti
ne' dal sistema stesso a causa di pending writes come anche di sweep gestiti
dai threads in background..
il vincolo e' imperativo in quanto l'applicazione, unitamente ai db dovra'
essere ospitata su chiavetta usb per l'estrema portabilita' richiesta tra
macchina e macchina senza necessita' di installazione se non, ovviamente,
del motore, Net FWK ed eventuali provider/componenti..

ho seguito anche il tuo thread su comp.database relativo all'indirizzamento
di rete di un percorso, quello che tramite SQL Server e' direttamente
disponibile ad esempio tramite xp_dirtree..
</OT>
grazie e saluti
--
Andrea Montanari (Microsoft MVP - SQL Server)
http://www.asql.biz http://italy.mvps.org
DbaMgr2k ver 0.21.0 - DbaMgr ver 0.65.0 and further SQL Tools
--------- remove DMO to reply
Andrea [Work]
2007-11-28 13:37:18 UTC
Permalink
Post by Andrea Montanari
a problematica che non "risolvo" a livello mentale (sono parecchio
indietro, eh?) sarebbe relativo a come "distacchi" i database in Firebird,
similarmente a sp_detach_db di SQL Server.. sia per smontare un db per
copia, che la gestione applicativa/interattiva di backup/restore.. mi sono
letto http://www.compman.co.uk/scripts/browse.asp?ref=638130 con
l'integrazione (pdf) per la V2, ed a tale proposito nulla e' indicato.. ho
solo trovato un warning via Google relativo ad essere "darn sure" ( :) ) che
il database non sia in uso, ne' interattivamente da parte di altri utenti
ne' dal sistema stesso a causa di pending writes come anche di sweep gestiti
dai threads in background..
Per firebird 1.5x c'è GBAK per firebird 2.x c'è nbackup:
http://www.firebirdsql.org/manual/nbackup.html

Il fatto che non ci debba essere nessuno attaccato non lo ricordo infatti
(se ho tradotto bene :D):

| Both modes can operate on an active database, without hindering connected
| users. The backup created will always reflect the state of the database
| at the beginning of the operation. In these respects nbackup doesn't
| differ from gbak.

Nella pratica ti posso dire che al 99% se faccio una copia proprio da win
del file .GDB funziona. A volte però il file copiato è corrotto, ma ti
parlo di 2 volte in 3 anni, e accade (credo) solo se qualcuno probabilmente
sta scrivendo, non se ci sono connection inattive o in lettura.
Andrea Montanari
2007-11-28 15:12:46 UTC
Permalink
salve Andrea,
Post by Andrea [Work]
http://www.firebirdsql.org/manual/nbackup.html
Il fatto che non ci debba essere nessuno attaccato non lo ricordo
Post by Andrea [Work]
Both modes can operate on an active database, without hindering
connected users. The backup created will always reflect the state of
the database
at the beginning of the operation. In these respects nbackup doesn't
differ from gbak.
sul fatto dell'hot backup ok, lo avevo compreso.. mi spaventa piu' l'hot
"restore"..
cioe' tronchi (o tenti di troncare) una connessione live di eventuali altri
utenti... bene o male come SQL Server, che pero' solleva l'eccezione di
incapacita' di ottenere un lock esclusivo sul db, cosa che spero faccia
anche Firebird...
Post by Andrea [Work]
Nella pratica ti posso dire che al 99% se faccio una copia proprio da
win del file .GDB funziona. A volte però il file copiato è corrotto,
ma ti parlo di 2 volte in 3 anni, e accade (credo) solo se qualcuno
probabilmente sta scrivendo, non se ci sono connection inattive o in
lettura.
ecco questo mi spaventa ed e' la cosa che vorrei approfondire, nel senso che
prima di "copiare/spostare" un file (o set di file) vorrei avere una "certa"
sicurezza sul fatto che il db non sia effettivamente in uso, quindi la
funzionalita' di sp_detach_db stessa offerta da SQL Server.. infatti, anche
su SQL Server, se il database non e' in uso, e con l'opzione autoclose
impostata, la copia puo' avere effetto positivo, ma non e' affatto garantito
visto che il database potrebbe essere in uso per uno svariato insieme di
motivi, cosa che avviene anche in Firebird... vorrei cioe' essere ben certo
che, oltre a non esserci utenti attivi, anche se in modalita' read-only, non
ci siano thread in background di sistema (ghost records cleaning, cleanup
delle versioni di riga, etc.. quindi sostanzialmente gli sweep) in funzione,
visto che non e' affatto assicurato che la disconnessione dell'utlimo utente
attivo rilasci in effetti il db in uno stato "clean", cosa per l'altro
documentata e rispettabile... su questi aspetti ho invero delle perplessita'
che non mi dispiacerebbe affrontare con chi ha esperienza su questa
piattaforma.. saro' anche tarato, ma non mi dispiace affatto scendere nel
dettaglio dell'implementazione e nelle specifiche dello storage engine in
se'..
eventualmente il mio indirizzo mail ce l'hai, e non disdegnerei magari
approfondire privatamente, se possibile.. anche se non con urgenza.. :)
saluti e grazie
--
Andrea Montanari (Microsoft MVP - SQL Server)
http://www.asql.biz http://italy.mvps.org
DbaMgr2k ver 0.21.0 - DbaMgr ver 0.65.0 and further SQL Tools
--------- remove DMO to reply
Andrea [Work]
2007-11-29 13:43:50 UTC
Permalink
Post by Andrea Montanari
sul fatto dell'hot backup ok, lo avevo compreso.. mi spaventa piu' l'hot
"restore"..
cioe' tronchi (o tenti di troncare) una connessione live di eventuali altri
utenti... bene o male come SQL Server, che pero' solleva l'eccezione di
incapacita' di ottenere un lock esclusivo sul db, cosa che spero faccia
anche Firebird...
Ma gli archivi non sono su PenDrive e singolo utente?
Post by Andrea Montanari
ecco questo mi spaventa ed e' la cosa che vorrei approfondire, nel senso che
prima di "copiare/spostare" un file (o set di file) vorrei avere una "certa"
sicurezza sul fatto che il db non sia effettivamente in uso, quindi la
funzionalita' di sp_detach_db stessa offerta da SQL Server.. infatti, anche
su SQL Server, se il database non e' in uso, e con l'opzione autoclose
impostata, la copia puo' avere effetto positivo, ma non e' affatto garantito
visto che il database potrebbe essere in uso per uno svariato insieme di
motivi, cosa che avviene anche in Firebird...
Allora io ti parlavo che all'atto pratico "quasi sempre" puoi fare anche un
copia/incolla. Ovviamente non è il sistema da usare in un'applicazione :)
Post by Andrea Montanari
vorrei cioe' essere ben certo
che, oltre a non esserci utenti attivi, anche se in modalita' read-only, non
ci siano thread in background di sistema (ghost records cleaning, cleanup
delle versioni di riga, etc.. quindi sostanzialmente gli sweep) in funzione,
visto che non e' affatto assicurato che la disconnessione dell'utlimo utente
attivo rilasci in effetti il db in uno stato "clean", cosa per l'altro
documentata e rispettabile... su questi aspetti ho invero delle perplessita'
che non mi dispiacerebbe affrontare con chi ha esperienza su questa
piattaforma.. saro' anche tarato, ma non mi dispiace affatto scendere nel
dettaglio dell'implementazione e nelle specifiche dello storage engine in
se'..
Non ho tempo di leggerlo, ma prova a guardare qui:
http://database.html.it/articoli/leggi/2145/usare-firebird-da-linea-di-comando/4/
Comunque con IBOConsole puoi fare shutdown, vedere utenti connessi ecc,
alla fine saranno comandi a linea di comando dei vari gbak, gfix ecc.

Ah non usare file .gdb (interbase), perchè winxp li inserisce fra il
ripristino config. sistema. Usa l'estensione default di firebird .fdb.
Post by Andrea Montanari
eventualmente il mio indirizzo mail ce l'hai, e non disdegnerei magari
approfondire privatamente, se possibile.. anche se non con urgenza.. :)
saluti e grazie
Ho messo "in chiaro" anche il mio, puoi scrivermi lì.
Andrea Montanari
2007-11-29 15:35:16 UTC
Permalink
salve Andrea,
Post by Andrea [Work]
Post by Andrea Montanari
sul fatto dell'hot backup ok, lo avevo compreso.. mi spaventa piu'
l'hot "restore"..
cioe' tronchi (o tenti di troncare) una connessione live di
eventuali altri utenti... bene o male come SQL Server, che pero'
solleva l'eccezione di incapacita' di ottenere un lock esclusivo sul
db, cosa che spero faccia anche Firebird...
Ma gli archivi non sono su PenDrive e singolo utente?
potrebbero essere su PenDrive, ma i db potrebbero essere multi user..
Post by Andrea [Work]
..
http://database.html.it/articoli/leggi/2145/usare-firebird-da-linea-di-comando/4/
Comunque con IBOConsole puoi fare shutdown, vedere utenti connessi
ecc, alla fine saranno comandi a linea di comando dei vari gbak, gfix
ecc.
ci do un'occhiata..
Post by Andrea [Work]
Ah non usare file .gdb (interbase), perchè winxp li inserisce fra il
ripristino config. sistema. Usa l'estensione default di firebird .fdb.
si, questo l'avevo gia' notato..
Post by Andrea [Work]
Post by Andrea Montanari
eventualmente il mio indirizzo mail ce l'hai, e non disdegnerei
magari approfondire privatamente, se possibile.. anche se non con
urgenza.. :) saluti e grazie
Ho messo "in chiaro" anche il mio, puoi scrivermi lì.
immagino sia @ gmail . it, vero? :)
saluti e grazie
--
Andrea Montanari (Microsoft MVP - SQL Server)
http://www.asql.biz http://italy.mvps.org
DbaMgr2k ver 0.21.0 - DbaMgr ver 0.65.0 and further SQL Tools
--------- remove DMO to reply
Andrea [Work]
2007-11-30 08:01:38 UTC
Permalink
.com :))

Loading...