Newsgroup: it.comp.lang.delphi
Titolo: Questa query sbaglia

Questa è la select:
UPDATE MOVIM M SET NOME= (select Nome from Titoli T where M.LINK=
T.ID
) where 
M.TIPO="I"'
 
L'intenzione della query è di assegnare al campo NOME del datset MOVIM  il 
valore dell'omonimo campo del dataset TITOLI.
 
I due dataset sono legati dai campi LINK e ID.  Solo i records di MOVIM che 
hanno il Tipo "I" devono essere aggiornati.
 
Ci sono alcuni records di MOVIM che, pur essendo di tipo "I", non ci sono 
nel dataset TITOLI. In questi è avvenuto il problema, e cioè la query ha 
aggiornato anche il NOME di questi record, con il NOME da TITOLI assegnato 
con un criterio sconosciuto.
 
Ci ho lavorato tutto il giorno, ma non sono riuscito a capire. C'è qualcuno 
che ci capisce? 
 

che ci capisce? 
 
Non so che database usi ma proverei, (non l'ho fatto)
cosi:
UPDATE movim m, titoli t
set m.nome=t.nome
where m.link=
t.id
 
and m.tipo="I"
 
Non capisco perchč hai duplicato il nome del titolo
anche sui movimenti.
Nelle select su movim potevi far riferimento al nome 
nell'archivio titoli.
E' necessario un indice Unique su 
titoli.id
 

Non so che database usi ma proverei, (non l'ho fatto)
cosi:
UPDATE movim m, titoli t
set m.nome=t.nome
where m.link=
t.id
 
and m.tipo="I"
 
Non capisco perchè hai duplicato il nome del titolo
anche sui movimenti.
Nelle select su movim potevi far riferimento al nome
nell'archivio titoli.
E' necessario un indice Unique su 
titoli.id
 
--
Uso il BDE e adesso provo il tuo suggerimento. Il nome del Titolo c'è nei 
movimenti perchè a volte è comodo averlo lì. E' in fase di creazione del 
movimento che l'utente fornisce il nome del titolo. Il riallineamento del 
file dei movimenti si è reso necessario per un errore che ha corrotto questo 
dato e questa è la ragione della query di aggiornamento. 
 

Non so che database usi ma proverei, (non l'ho fatto)
cosi:
UPDATE movim m, titoli t
set m.nome=t.nome
where m.link=
t.id
 
and m.tipo="I"
__
Risultato della prova: invalid use of keyword ','.
 
E' molto probabile che in un'espressione con UPDATE non si possano 
specificare due dataset.. 
 


wrote:

Io uso Mysql, il manuale riporta questo esempio:
 
UPDATE items,month SET items.price=month.price
WHERE 
items.id
=
month.id
;
 
con il DBE dovresti avere a disposizione i metodi
della tabella come:
 
table.first
table.eof
table.fieldbyname(...).as...:=...
table.post
 
table.next
 
se non riesci con SQL ci vuole poco a fare un ciclo di aggiornamento.
 

Grazie del tentativo di aiuto e si, posso fare l'aggiornamento in altro 
modo, ma mi ero intestardito a far funzionare la select SQL che mi appariva 
così semplice.
 


Se ho capito bene, hai alcuni record di MOVIM che hanno TIPO = 'I' ma
non hanno nessun record su TITOLI.
 
Tu che valore ti aspetti che venga messo in NOME in quel caso?
 
La select che hai messo va a fare un lookup su una tabella
e ti restituisce 0 record. Evidentemente il povero BDE non sa
come gestire la situazione e invece che dare un errore (come
invece dovrebbe fare!) ti assegna un valore "a caso" (immagino
che ci sia una logica, dipende da come funziona internamente BDE)
 
Se pensi che non debba assegnare nulla ma che debba aggiornare
solo i record che hanno un record su TITOLI... la risposta
e' banale: basta escludere dalla UPDATE anche i record che non
hanno un corrispondente su TITOLI.
 
Prova qualcosa del genere (sempre che il BDE lo supporti)
 
UPDATE ...
WHERE
M.Tipo = 'I'
AND EXISTS( select * from TITOLI T where M.LINK=
T.ID
)
 
 
ciao
Giacomo

"Giacomo Degli Esposti"  ha scritto nel messaggio 
news:761476fe-a61e-4f30...@googlegroups.com...
Se ho capito bene, hai alcuni record di MOVIM che hanno TIPO = 'I' ma
non hanno nessun record su TITOLI.
 
Tu che valore ti aspetti che venga messo in NOME in quel caso?
 
La select che hai messo va a fare un lookup su una tabella
e ti restituisce 0 record. Evidentemente il povero BDE non sa
come gestire la situazione e invece che dare un errore (come
invece dovrebbe fare!) ti assegna un valore "a caso" (immagino
che ci sia una logica, dipende da come funziona internamente BDE)
 
Se pensi che non debba assegnare nulla ma che debba aggiornare
solo i record che hanno un record su TITOLI... la risposta
e' banale: basta escludere dalla UPDATE anche i record che non
hanno un corrispondente su TITOLI.
 
Prova qualcosa del genere (sempre che il BDE lo supporti)
 
UPDATE ...
WHERE
M.Tipo = 'I'
AND EXISTS( select * from TITOLI T where M.LINK=
T.ID
)
ciao
Giacomo
---
Non avrei potuto spiegare meglio il problema. Infatti è così, avevo 
subdorato anch'io che il BDE on sapesse gestire la situazione, ma non sapevo 
come trovare il modo di escludere quei casi dall'update. La espressione che 
mi suggerisci (EXTSTS) non sapevo che esistesse. La provo subito per vedere 
se è accettata. Grazie 
 

FUNZIONA. Problema risolto !!
Grazie Giacomo