Newsgroup: it.comp.lang.visual-basic
Titolo: query di update simil inner join

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

 '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 

 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.

 modo non č certo sicura).
...
Uhm, e perche'?
Ciao e grazie... Maurizio 

 Uhm, e perche'?
Se nella descrizione uno ha scritto "secchio" o "SEcchio" o "Secchi0" ?
Se si sicuro di cosa c'è scritto allora va bene...

Salve,

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 

 UPPER(@parametro) :)
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 :)


<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


 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.

 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


 saluti e grazie
Ho messo "in chiaro" anche il mio, puoi scrivermi lě.

 Ho messo "in chiaro" anche il mio, puoi scrivermi lě.
immagino sia @ gmail . it, vero? :)


 immagino sia @ gmail . it, vero? :)
.com :))