Newsgroup: it.comp.software.database
Titolo: Ibridi Select Update

Buongiorno a tutti, inanzitutto.
Ho da porre un quesito:
E' possibile eseguire una SELECT e nello stesso momento eseguire anche un
UPDATE sugli stessi campi? Vediamo se riesco a spiegarmi meglio..
Eseguo una SELECT su una tabella del mio database per tutti quei record che
hanno una campo della mia tabella impostato ad un certo valore (supponiamo
'N', come se fosse un FLAG, insomma). Di seguito devo reimpostare quel FLAG
a 'S'. Quel che mi chiedevo è se era possibile fare l'UPDATE direttamente
senza scorrermi i campi due volte, una per la SELECT e una per l'UPDATE.
In teoria questo sarebbe possibile dato che comunque i record nella SELECT
vengono passati uno ad uno, ma è la risposta pratica che mi manca..
Grazie, Claudio...



Se devi cambiare il valore di tutti i campi il cui flag è N per
passrla ad S, basta lanciare l'update
update <tabella> set flag ='S' where flag='N';
A cosa ti serve la select? L'unica cosa che possa venirmi
in mente è contare quante righe hanno il flag N:
select count(*) where flag ='N'
Questo è inutile, visto che l'update ti restituisce il nr.
di righe aggiornate.
RICORDA DI FARE IL COMMIT DOPO AVER ESEGUITO UPDATE.

Si, scusami, fose mi sono spiegato male:
(Vediamo se postandoti le istruzioni SQL riesco a farmi capire meglio)
Declare @IPNB Varchar(2)
Declare @TM Varchar(1)
Declare @IG Tinyint
--Inizializzo le variabili che mi servono
--ID MAGAZZINO
Select  @IPNB=Pv_idPuntoVendita
From  GTB_PUNTIVENDITA
Where  Pv_CodPuntoVendita='NB'
--CODICE MOVIMENTO ACQUISTATO
Set  @TM='5'
--ID GRUPPO
Set  @IG=8
/*
SVILUPPO:
*/
Insert Into  FILES_TABLE_WRK  --DA SOSTITUIRE CON FILES_TABLE ALLA FINE
DELLO SVILUPPO E DEI TEST
Select   @TM As TipoMovimento,
  F.Mat_idMateriale As idMateriale,
  @IPNB As idPuntoVendita,
  F.Flt_Data As Data,
  F.Tgl_idTaglia As idTaglia,
  Abs(Sum(F.Flt_Quantita*T.Gft_SegnoGiacenza)) As Quantita,
  Max(F.Flt_PrezzoMedio*T.Gft_SegnoGiacenza) As PrezzoMedio,
  Max(F.Flt_Varianza*T.Gft_SegnoGiacenza) As Varianza,
  Max(F.Mat_PrzAcquisto*T.Gft_SegnoGiacenza) As PrzAcquisto,
  Max(F.Mat_PrzListino*T.Gft_SegnoGiacenza) As PrzListino,
  F.Mattgl_id As Mattglid,
  NULL As Timeid, --F.Time_id As Timeid,
  Max(F.Flt_PrzNetto*T.Gft_SegnoGiacenza) As PrzNetto,
  Sum(F.Flt_QuantitaSegno) As QuantitaSegno,
  NULL As Matid,  --F.Mat_id As Matid,
  NULL As DataRegOLAP, --F.Flt_DataRegOLAP As DataRegOLAP,
  NULL As FlagLastAcq,
  Max(F.Flt_PrezzoMedio_Euro*T.Gft_SegnoGiacenza) As PrezzoMedio_Euro,
  Max(F.Flt_Varianza_Euro*T.Gft_SegnoGiacenza) As Varianza_Euro,
  Max(F.Mat_PrzAcquisto_Euro*T.Gft_SegnoGiacenza) As PrzAcquisto_Euro,
  Max(F.Mat_PrzListino_Euro*T.Gft_SegnoGiacenza) As PrzListinoEuro,
  Max(F.Flt_PrzNetto_Euro*T.Gft_SegnoGiacenza) As PrzNetto_Euro,
  Max(F.Mat_PrzAcquisto_Pv*T.Gft_SegnoGiacenza) As PrzAcquisto_Pv,
  Max(F.Mat_PrzAcquisto_Pv_Euro*T.Gft_SegnoGiacenza) As PrzAcquisto_Pv_Euro,
  F.Group_id As Groupid,
  'N' As FlagAcquistatoElaborato
From  FILES_TABLE_WRK F   --DA SOSTITUIRE CON FILES_TABLE ALLA FINE DELLO
SVILUPPO E DEI TEST
Inner Join GTB_TIPOMOVIMENTO T
On  F.Flt_TipoMovimento=T.Flt_TipoMovimento
Where  F.Flt_TipoMovimento='1'
 And (F.Flt_FlagAcquistatoElaborato IS NULL Or
F.Flt_FlagAcquistatoElaborato='N')
 And F.Group_id=@IG
Group By F.Mat_idMateriale,
  F.Flt_Data,
  F.Tgl_idTaglia,
  F.Mattgl_id,
  F.Group_id
/*Ora imposto a tutti i record elaborati con Flt_TipoMovimento='1' il
FlagAcquistatoElaborato a 'S', in modo che in una successiva elaborazione
non vengan contenggiati*/
Update   FILES_TABLE_WRK   --DA SOSTITUIRE CON FILES_TABLE ALLA FINE DELLO
SVILUPPO E DEI TEST
Set  Flt_FlagAcquistatoElaborato='S'
From   FILES_TABLE_WRK F   --DA SOSTITUIRE CON FILES_TABLE ALLA FINE DELLO
SVILUPPO E DEI TEST
Where  F.Flt_TipoMovimento='1'
 And F.Group_id=@IG
In pratica devo eleborare i record che hanno il flag elaborato a 'N' e
successivamente reimpostare quel flag a 'S', e dato che sia la select che
l'update lavorano sugli stessi campi mi chiedevo se era possibile far tutto
in una unica istruzione T-SQL, senza caricare il server di un doppio lavoro.
Spero sia riuscito a farmi intendere

 Spero sia riuscito a farmi intendere
Mi spiace, ma non riesco a capire