>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