Aiuto per query di aggiornamento con dati in tabelle diverse

martedì 15 gennaio 2008 - 17.20

actarus1981 Profilo | Junior Member

Ciao a tutti,
avrei la necessità di aggiornare un campo di una tabella con il valore ricavato da un'altra tabella. Di seguito la struttura delle due tabelle e alcuni record inseriti in modo da spiegarmi meglio:

CREATE TABLE dbo.call_closed( id_call int NOT NULL IDENTITY PRIMARY KEY, tecnico varchar(10) NULL ); INSERT dbo.call_closed VALUES(1, NULL); INSERT dbo.call_closed VALUES(2, NULL); INSERT dbo.call_closed VALUES(3, NULL); INSERT dbo.call_closed VALUES(4, NULL); INSERT dbo.call_closed VALUES(5, NULL); GO CREATE TABLE dbo.status( id_call int NOT NULL, data varchar(8) NOT NULL , tecnico varchar(10) NOT NULL ); INSERT dbo.status VALUES(1, '20080110', 'Fabio'); INSERT dbo.status VALUES(1, '20080111', 'Giuseppe'); INSERT dbo.status VALUES(1, '20080115', 'Simone'); GO

Quello che vorrei fare è aggiornare il valore di [tecnico] della tabella [call_closed] con il valore di [tecnico] della tabella [status] legando il campo [id_call] delle due tabelle e selezionando da [status] il valore di [tecnico] dove la data è massima.

Come posso fare? spero di essermi spiegato abbastanza bene!

alx_81 Profilo | Guru

>Ciao a tutti,
Ciao!

>Quello che vorrei fare è aggiornare il valore di [tecnico] della
>tabella [call_closed] con il valore di [tecnico] della tabella
>[status] legando il campo [id_call] delle due tabelle e selezionando
>da [status] il valore di [tecnico] dove la data è massima.
>
>Come posso fare? spero di essermi spiegato abbastanza bene!
Provo a dare un'occhiata a questo esempio:

USE tempdb; GO CREATE TABLE dbo.call_closed ( id_call int NOT NULL IDENTITY PRIMARY KEY , tecnico varchar(10) NULL ); GO INSERT dbo.call_closed VALUES('Manuele'); INSERT dbo.call_closed VALUES('Marco'); INSERT dbo.call_closed VALUES('Michael'); INSERT dbo.call_closed VALUES('Matteo'); INSERT dbo.call_closed VALUES('Andrea'); GO CREATE TABLE dbo.status ( id_call int NOT NULL , data varchar(8) NOT NULL , tecnico varchar(10) NOT NULL ); GO INSERT dbo.status VALUES(1, '20080110', 'Fabio'); INSERT dbo.status VALUES(1, '20080111', 'Giuseppe'); INSERT dbo.status VALUES(1, '20080115', 'Simone'); INSERT dbo.status VALUES(2, '20080111', 'Andrea'); INSERT dbo.status VALUES(2, '20080113', 'Michael'); INSERT dbo.status VALUES(3, '20080111', 'Andrea'); INSERT dbo.status VALUES(3, '20080114', 'Alessandro'); GO -- prima di aggiornare SELECT * FROM dbo.call_closed UPDATE C SET tecnico = S.tecnico FROM ( SELECT id_call , MAX(data) AS Data FROM dbo.status GROUP BY id_call ) AS T JOIN dbo.call_closed C ON C.id_call = T.id_call JOIN dbo.status S ON S.id_call = T.id_call AND S.data = T.data -- dopo l'aggiornamento SELECT * FROM dbo.call_closed -- pulizia DROP TABLE dbo.status DROP TABLE dbo.call_closed GO


se hai una versione SQL Server 2005 puoi usare la seguente sintassi alternativa con le CTE (Common Table Expression):

USE tempdb; GO CREATE TABLE dbo.call_closed ( id_call int NOT NULL IDENTITY PRIMARY KEY , tecnico varchar(10) NULL ); GO INSERT dbo.call_closed VALUES('Manuele'); INSERT dbo.call_closed VALUES('Marco'); INSERT dbo.call_closed VALUES('Michael'); INSERT dbo.call_closed VALUES('Matteo'); INSERT dbo.call_closed VALUES('Andrea'); GO CREATE TABLE dbo.status ( id_call int NOT NULL , data varchar(8) NOT NULL , tecnico varchar(10) NOT NULL ); GO INSERT dbo.status VALUES(1, '20080110', 'Fabio'); INSERT dbo.status VALUES(1, '20080111', 'Giuseppe'); INSERT dbo.status VALUES(1, '20080115', 'Simone'); INSERT dbo.status VALUES(2, '20080111', 'Andrea'); INSERT dbo.status VALUES(2, '20080113', 'Michael'); INSERT dbo.status VALUES(3, '20080111', 'Andrea'); INSERT dbo.status VALUES(3, '20080114', 'Alessandro'); GO -- prima di aggiornare SELECT * FROM dbo.call_closed -- with, solo per 2005 e successive ;WITH MaxDate AS ( SELECT id_call , MAX(data) AS Data FROM dbo.status GROUP BY id_call ) UPDATE C SET tecnico = S.tecnico FROM MaxDate AS T JOIN dbo.call_closed C ON C.id_call = T.id_call JOIN dbo.status S ON S.id_call = T.id_call AND S.data = T.data -- dopo l'aggiornamento SELECT * FROM dbo.call_closed -- pulizia DROP TABLE dbo.status DROP TABLE dbo.call_closed GO

Qui di seguito la reference per la with:

WITH common_teble_expression
http://technet.microsoft.com/it-it/library/ms175972.aspx

ciao!
Alx81 =)

http://blogs.dotnethell.it/suxstellino
http://mvp.support.microsoft.com/profile/Alessandro.Alpi
http://italy.mvps.org

actarus1981 Profilo | Junior Member

Perfetto, grazie dell'aiuto!!!
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2024
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5