>In pratica dovrei copiare i dati delle colonne B1, B2, B3 e B4
>nelle Colonne A6,A7,A8,A9 in corrispondenza del ID_cliente.
>Come posso fare?
Ciao Giampiero,
Osserva il seguente esempio:
USE tempdb;
CREATE TABLE dbo.TabellaA(
ID_Cliente int NOT NULL PRIMARY KEY,
A2 varchar(10) NULL,
A3 varchar(10) NULL,
A4 varchar(10) NULL,
A5 varchar(10) NULL,
A6 varchar(10) NULL,
A7 varchar(10) NULL,
A8 varchar(10) NULL,
A9 varchar(10) NULL
);
CREATE TABLE dbo.TabellaB(
B1 varchar(10) NULL,
B2 varchar(10) NULL,
B3 varchar(10) NULL,
B4 varchar(10) NULL,
ID_Cliente int NOT NULL,
CONSTRAINT FK_TabellaB_TabellaA FOREIGN KEY (ID_Cliente)
REFERENCES dbo.TabellaA(ID_Cliente)
);
INSERT dbo.TabellaA(ID_Cliente, A2, A3, A4, A5)
VALUES (1, 'A2 riga 1', 'A3 riga 1', 'A4 riga 1', 'A5 riga 1')
, (2, 'A2 riga 2', 'A3 riga 2', 'A4 riga 2', 'A5 riga 2')
, (3, 'A2 riga 3', 'A3 riga 3', 'A4 riga 3', 'A5 riga 3')
, (4, 'A2 riga 4', 'A3 riga 4', 'A4 riga 4', 'A5 riga 4')
, (5, 'A2 riga 5', 'A3 riga 5', 'A4 riga 5', 'A5 riga 5');
INSERT dbo.TabellaB
VALUES ('B1 riga 1', 'B2 riga 1', 'B3 riga 1', 'B4 riga 1', 1)
, ('B1 riga 2', 'B2 riga 2', 'B3 riga 2', 'B4 riga 2', 2)
, ('B1 riga 4', 'B2 riga 4', 'B3 riga 4', 'B4 riga 4', 4);
UPDATE A
SET A.A6 = B.B1
, A.A7 = B.B2
, A.A8 = B.B3
, A.A9 = B.B4
FROM dbo.TabellaA AS A
JOIN dbo.TabellaB AS B
ON A.ID_Cliente = B.ID_Cliente;
/* Output:
(3 row(s) affected)
*/
SELECT *
FROM dbo.TabellaA;
/* Output:
ID_Cliente A2 A3 A4 A5 A6 A7 A8 A9
----------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ----------
1 A2 riga 1 A3 riga 1 A4 riga 1 A5 riga 1 B1 riga 1 B2 riga 1 B3 riga 1 B4 riga 1
2 A2 riga 2 A3 riga 2 A4 riga 2 A5 riga 2 B1 riga 2 B2 riga 2 B3 riga 2 B4 riga 2
3 A2 riga 3 A3 riga 3 A4 riga 3 A5 riga 3 NULL NULL NULL NULL
4 A2 riga 4 A3 riga 4 A4 riga 4 A5 riga 4 B1 riga 4 B2 riga 4 B3 riga 4 B4 riga 4
5 A2 riga 5 A3 riga 5 A4 riga 5 A5 riga 5 NULL NULL NULL NULL
(5 row(s) affected)
*/
DROP TABLE dbo.TabellaB, dbo.TabellaA;
Come puoi vedere ho eseguito una UPDATE della TabellaA mettendola in JOIN con la TabellaB. Nel caso esistano più righe nella TabellaB per lo stesso ID_Cliente devi decidere come procedere. In questo esempio andrò a considerare i MAX() di ogni colonna B* per lo stesso cliente:
USE tempdb;
CREATE TABLE dbo.TabellaA(
ID_Cliente int NOT NULL PRIMARY KEY,
A2 varchar(10) NULL,
A3 varchar(10) NULL,
A4 varchar(10) NULL,
A5 varchar(10) NULL,
A6 varchar(10) NULL,
A7 varchar(10) NULL,
A8 varchar(10) NULL,
A9 varchar(10) NULL
);
CREATE TABLE dbo.TabellaB(
B1 varchar(10) NULL,
B2 varchar(10) NULL,
B3 varchar(10) NULL,
B4 varchar(10) NULL,
ID_Cliente int NOT NULL,
CONSTRAINT FK_TabellaB_TabellaA FOREIGN KEY (ID_Cliente)
REFERENCES dbo.TabellaA(ID_Cliente)
);
INSERT dbo.TabellaA(ID_Cliente, A2, A3, A4, A5)
VALUES (1, 'A2 riga 1', 'A3 riga 1', 'A4 riga 1', 'A5 riga 1')
, (2, 'A2 riga 2', 'A3 riga 2', 'A4 riga 2', 'A5 riga 2')
, (3, 'A2 riga 3', 'A3 riga 3', 'A4 riga 3', 'A5 riga 3')
, (4, 'A2 riga 4', 'A3 riga 4', 'A4 riga 4', 'A5 riga 4')
, (5, 'A2 riga 5', 'A3 riga 5', 'A4 riga 5', 'A5 riga 5');
INSERT dbo.TabellaB
VALUES ('B1 riga 1', 'B2 riga 1', 'B3 riga 1', 'B4 riga 1', 1)
, ('B1 riga 2', 'B2 riga 2', 'B3 riga 2', 'B4 riga 2', 2)
, ('B1 riga 4', 'B2 riga 4', 'B3 riga 4', 'B4 riga 4', 4)
, ('B1 riga 5', 'B2 riga 5', 'B3 riga 5', 'B4 riga 5', 4)
, ('B1 riga 6', 'B2 riga 6', 'B3 riga 6', 'B4 riga 6', 4);
WITH CTE_GetData(ID_Cliente, B1, B2, B3, B4) AS
(
SELECT ID_Cliente, MAX(B1), MAX(B2), MAX(B3), MAX(B4)
FROM dbo.TabellaB
GROUP BY ID_Cliente
)
UPDATE A
SET A.A6 = C.B1
, A.A7 = C.B2
, A.A8 = C.B3
, A.A9 = C.B4
FROM dbo.TabellaA AS A
JOIN CTE_GetData AS C
ON A.ID_Cliente = C.ID_Cliente;
/* Output:
(3 row(s) affected)
*/
SELECT *
FROM dbo.TabellaA;
/* Output:
ID_Cliente A2 A3 A4 A5 A6 A7 A8 A9
----------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ----------
1 A2 riga 1 A3 riga 1 A4 riga 1 A5 riga 1 B1 riga 1 B2 riga 1 B3 riga 1 B4 riga 1
2 A2 riga 2 A3 riga 2 A4 riga 2 A5 riga 2 B1 riga 2 B2 riga 2 B3 riga 2 B4 riga 2
3 A2 riga 3 A3 riga 3 A4 riga 3 A5 riga 3 NULL NULL NULL NULL
4 A2 riga 4 A3 riga 4 A4 riga 4 A5 riga 4 B1 riga 6 B2 riga 6 B3 riga 6 B4 riga 6
5 A2 riga 5 A3 riga 5 A4 riga 5 A5 riga 5 NULL NULL NULL NULL
(5 row(s) affected)
*/
DROP TABLE dbo.TabellaB, dbo.TabellaA;
Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/