Spostamento dati fra table

martedì 14 febbraio 2012 - 17.55
Tag Elenco Tags  C#  |  .NET 4.0  |  Windows Server 2008  |  Visual Studio 2010  |  SQL Server 2008 R2  |  SQL Server 2008  |  SQL Server 2005

jampicoll Profilo | Junior Member

Salve,
ho un piccolo problema
in pratica ho due tabelle
TabellaA
ID_Cliente [Key], Colonna A2, Colonna A3,...Colonna A9

TabellaB
ColonnaB1, Colonna B2, Colonna B3, Colonna B4, ID_Cliente.

Legate da un relazione 1 a molti.
In pratica dovrei copiare i dati delle colonne B1, B2, B3 e B4 nelle Colonne A6,A7,A8,A9 in corrispondenza del ID_cliente.
Spero di essere stato chiaro
Come posso fare?



Giampiero.

lbenaglia Profilo | Guru

>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/

jampicoll Profilo | Junior Member

Come sempre davvero gentilissimo!!!
Per i record duplicati potrei procedere con l'ordine naturale di scorrimento della tabella B.
(se ne incontro due vale il secondo)
Come faccio a realizzare una funzione che mi automatizzi il tutto?
Giampiero.

lbenaglia Profilo | Guru

>Per i record duplicati potrei procedere con l'ordine naturale
>di scorrimento della tabella B.

L'"ordine naturale" non so cosa sia
Devi scegliere una regola di raggruppamento esattamente come nel secondo esempio.

>Come faccio a realizzare una funzione che mi automatizzi il tutto?
CREATE PROCEDURE...

Ciao!

--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/

jampicoll Profilo | Junior Member

Intendevo dire in ordine di id crescente

cmq adesso è chiaro grazie.
Giampiero.
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-2017
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5