ciao, nonostante il ritardo, provo a risponderti. La prossima volta, passaci proprio le insert e le create delle tabelle, così ci faciliti la celerità della risposta.
>se noti nell'id 9 il valore di prova dovrebbe essere 1 perchè
>contiene 'ari' ma invece mi dà 0
>Come mai????
Quello che affermi non è corretto. Se provi infatti a fare la SELECT corrispondente alla tua update, in questo modo:
select *,case when (unico1='ari') then '1' else '0' end
FROM dati_dett, dati
WHERE (dati.id=dati_dett.id)
oppure scritta anche così, forse più comprensibile:
SELECT
*
, case when (unico1='ari') then '1' else '0' end
FROM
dbo.dati D
JOIN dbo.dati_dett DD ON D.id = DD.id
otterrai questo risultato:
[/code]10 20 0 10 20 lino 0
11 21 0 11 21 ari 1
12 18 0 12 18 ari 1
12 18 0 12 46 fra 0
12 18 0 12 24 ari 1
13 35 0 13 27 lino 0
13 35 0 13 35 lino 0
14 21 0 14 21 ari 1
15 13 0 15 13 lino 0
[/code]
dove hai id = 9 e quindi qui:
9 51 0 9 29 ari 1
9 51 0 9 35 fra 0
9 51 0 9 36 fra 0
9 51 0 9 48 lino 0
9 51 0 9 51 lino 0
noterai che solo dove il tuo record di dettaglio contiene ari il valore è 1 per la colonna definita nel CASE.
Siccome però fai l'update SOLO sull'id, il tuo 1 viene sovrascritto col resto del resultset.
In realtà la tua update aggiorna con l'ultimo verificato un set di righe.
Il comportamento è del tutto corretto..
Se tu vuoi impostare a 1 la colonna solo se ALMENO uno dei record di dettaglio è valorizzato ad 'ari', devi fare una update in cui ricavi gli id che hanno almeno una volta 'ari', come in questo esempio:
UPDATE dbo.dati
SET
prova = case when (unico1='ari') then '1' else '0' end
FROM dbo.dati D
LEFT JOIN dbo.dati_dett DD ON D.id = DD.id
AND DD.unico1 = 'ari'
In questo caso aggiorni a 0 ovunque non si verifichi il legame e ad 1 quando compare per un id almeno un dettaglio valorizzato ad 'ari'.
Ciao!
--
Alessandro Alpi | SQL Server MVP
http://www.alessandroalpi.net
http://blogs.dotnethell.it/suxstellino
http://mvp.support.microsoft.com/profile/Alessandro.Alpi
http://italy.mvps.org