Update query su Select

di il
3 risposte

Update query su Select

Ciao a tutti,

Ho bisogno di una dritta.

I seguenti record sono ottenuti come output della seguente SELECT:

SELECT * FROM TABELLA WHERE BATCH_TrainID = 'P2' AND BATCH_DataEnd >= '20220511000000';

id JH_BATCH_ID JH_PROC_ID BATCH_DataIni BATCH_DataEnd BATCH_TrainID
18635 RI22AA250 SCONGELO 20220511155730 20220511215119 P2
18646 RI22AA250 SCONGELO 20220511155730 20220511215119 P2
18647 RI22AA250 SCONGELO 20220511155730 20220511215119 P2
18648 RI22AA250 SCONGELO 20220511155730 20220511215119 P2
18665 P2_110522_2217 LAVAGGIO 20220511221716 20220512000218 P2
18666 P2_110522_2217 LAVAGGIO 20220511221716 20220512000218 P2
18699 RI22AA251 SCONGELO 20220512023521 20220512082850 P2
18700 RI22AA251 SCONGELO 20220512023521 20220512082850 P2
18701 RI22AA251 SCONGELO 20220512023521 20220512082850 P2
18709 RI22AA251 SCONGELO 20220512023521 20220512082850 P2
18713 P2_110522_1003 LAVAGGIO 20220511100326 20220511121023 P2
18714 P2_110522_1003 LAVAGGIO 20220511100326 20220511121023 P2

Su questo output, ho la necessità di aggiornare mediante UPDATE i campi

-JH_BATCH_ID
-BATCH_DataInI
-BATCH_DataEnd

dei record con JH_PROC_ID = LAVAGGIO

Ogni record con JH_PROC_ID = LAVAGGIO va aggiornato con i valori presenti nell'ultimo record immediatamente precedente
avente JH_PROC_ID = SCONGELO


Il risultato deve essere il seguente

id JH_BATCH_ID JH_PROC_ID BATCH_DataIni BATCH_DataEnd BATCH_TrainID
18635 RI22AA250 SCONGELO 20220511155730 20220511215119 P2
18646 RI22AA250 SCONGELO 20220511155730 20220511215119 P2
18647 RI22AA250 SCONGELO 20220511155730 20220511215119 P2
18648 RI22AA250 SCONGELO 20220511155730 20220511215119 P2
18665 RI22AA250 LAVAGGIO 20220511155730 20220511215119 P2
18666 RI22AA250 LAVAGGIO 20220511155730 20220511215119 P2
18699 RI22AA251 SCONGELO 20220512023521 20220512082850 P2
18700 RI22AA251 SCONGELO 20220512023521 20220512082850 P2
18701 RI22AA251 SCONGELO 20220512023521 20220512082850 P2
18709 RI22AA251 SCONGELO 20220512023521 20220512082850 P2
18713 RI22AA251 LAVAGGIO 20220512023521 20220512082850 P2
18714 RI22AA251 LAVAGGIO 20220512023521 20220512082850 P2

Grazie in anticipo

3 Risposte

  • Re: Update query su Select

    Dubito che sia possibile farlo con una UPDATE secca e singola.

    Crea delle tabelle temporanee in cui vai a inserire i dati che ti servono (quelli da aggiornare e/o quelli per l'aggiornamento) in modo da avere una copia salvata dei dati con i rispettivi ID univoci associati ai record che interessano.

    Usa poi quelle informazioni per apportare gli UPDATE sulla tabella originale, mettendola in JOIN con le tabelle temporanee create in precedenza.

    Bisogna ragionare un attimo sullo script SQL, ma eventualmente puoi iniziare ad approfondire gli argomenti segnalati che senz'altro ti serviranno.

    Ciao!
  • Re: Update query su Select

    Lo dubito anche io. E' abbastanza intricata la questione.

    Grazie mille per la dritta.
  • Re: Update query su Select

    Ciao robgiov.

    Ho visto questo tuo post e mi è sembrato interessante.
    Provo a darti un'idea di soluzione con l'avvertenza, però, che l'esito finale dipende un po' anche dalla logica che interconnette tra di loro i dati e sulla quale non ci hai detto molto.

    Anzitutto, cosa buona e giusta sarebbe quella di fornire un po' di codice per poter di replicare l'ambiente operativo.

    Facendo un po' di Cut & Past e qualche sforbiciata ai dati che hai fornito, ecco una struttura spero idonea su cui fare qualche esercizio.
    
    declare @TAB as table
    (
    	ID int
    	, JH_BATCH_ID varchar(50)
    	, JH_PROC_ID  varchar(50)
    	, BATCH_DataIni datetime
    	, BATCH_DataEnd datetime
    	, BATCH_TrainID char(2)
    )
    insert into @TAB(ID, JH_BATCH_ID, JH_PROC_ID, BATCH_DataIni, BATCH_DataEnd, BATCH_TrainID) values
     (18635, 'RI22AA250', 'SCONGELO', '20220511 15:57:27', '20220511 21:51:16', 'P2')
    ,(18646, 'RI22AA250', 'SCONGELO', '20220511 15:57:28', '20220511 21:51:17', 'P2')
    ,(18647, 'RI22AA250', 'SCONGELO', '20220511 15:57:29', '20220511 21:51:18', 'P2')
    ,(18648, 'RI22AA250', 'SCONGELO', '20220511 15:57:30', '20220511 21:51:19', 'P2')
    ,(18665, 'P2_110522_2217', 'LAVAGGIO', '20220511 22:17:16', '20220512 00:02:18', 'P2')
    ,(18666, 'P2_110522_2217', 'LAVAGGIO', '20220511 22:17:16', '20220512 00:02:18', 'P2')
    , (18667, 'P2_110522_2217', 'LAVAGGIO', '20220511 22:17:16', '20220512 00:02:18', 'P2')
    ,(18699, 'RI22AA251', 'SCONGELO', '20220512 02:35:18', '20220512 08:28:47', 'P2')
    ,(18700, 'RI22AA251', 'SCONGELO', '20220512 02:35:19', '20220512 08:28:48', 'P2')
    ,(18701, 'RI22AA251', 'SCONGELO', '20220512 02:35:20', '20220512 08:28:49', 'P2')
    ,(18709, 'RI22AA251', 'SCONGELO', '20220512 02:35:21', '20220512 08:28:50', 'P2')
    ,(18713, 'P2_110522_1003', 'LAVAGGIO', '20220511 10:03:26', '20220511 12:10:23', 'P2')
    ,(18714, 'P2_110522_1003', 'LAVAGGIO', '20220511 10:03:26', '20220511 12:10:23', 'P2')
    
    Mi sono preso un po' la libertà di aggiungere qualche record e di apportare qualche lieve modifica ai dati per essere certo di ottenere quello che hai chiesto.

    Creata la tabella, ho scritto due CTE che provvedono alla creazione di un modello per l'aggiornamento secondo le specifiche che hai dato.

    La prima CTE è propedeutica alla seconda per ragioni tecniche dal momento che non è possibile utilizzare i valori di ROW_NUMBER prima ancora che vengano generati.

    La seconda CTE fornisce il dataset delle righe da aggiornate con precalcolati gli ID da cui derivare i valori origine.

    Il resto lo fa la struttura di Update.

    Con i dati da te forniti il risultato che ho ottenuto mi pare coerente.

    E' un tentativo...spero sia utile.

    Ecco il codice:
    
    -- Prima dell'aggiornamento
    select *from @TAB order by ID
    
    -- Aggiornamento in corso...
    ;with cte as
    (
    	select
    	(
    		case 
    			when JH_PROC_ID = 'SCONGELO' then row_number() over (partition by JH_BATCH_ID order by ID desc)
    			when JH_PROC_ID = 'LAVAGGIO' then row_number() over (partition BY JH_BATCH_ID order by ID)
    			else null
    		end
    	) as RowNumber
    	, * 
    	from  @TAB 
    ) 
    ,cte_Update as
    (
    	select
    		(case when JH_PROC_ID = 'LAVAGGIO' then lag(id, RowNumber) over (order by ID) else null end) as Update_ID
    		, *
    	from CTE
    )
    update t set
    	JH_BATCH_ID = t1.JH_BATCH_ID
    	, BATCH_DataIni = t1.BATCH_DataIni
    	, BATCH_DataEnd = t1.BATCH_DataEnd
    from @tab t
    inner join cte_Update u on u.Update_ID is not null and t.ID = u.ID
    inner join @TAB t1 on t1.ID = u.Update_ID
    
    -- Dopo l'aggiornamento
    select * from @TAB
    
Devi accedere o registrarti per scrivere nel forum
3 risposte