186 messaggi dal 25 maggio 2007
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?
1.976 messaggi dal 27 luglio 2005
Contributi
salve,
innanzitutto hai un problema "basico", nel senso che dici di avere una relazione uno a molti, quindi nella tabella referenziate, tabellaB, puoi potenzialmente avere piu' righe che referenzino uan riga in tabellaA... devi quindi definire un criterio per selezionare la riga di tabellaB che venga utilizzata per l'aggiornamento di tabellaA... dopo di che puoi procedere oltre..
nel caso presente, non sapendo il "tuo criterio", ho utilizzato come discriminate la Col1 di tabellaB, ma va benissimo qualsiasi altro criterio... ho quindi utilizzato una common table expression per ottenere un resultset che avesse un numero ordinante in base alla partizione di IdParent ordinata, nel caso, per Col1...
fatto questo utilizzo il comando MERGE per fare l'update di tabellaA messa "in join" con la common table expression dove pero' escludo le righe con l'ordinante di riga maggiore di 1, prendendo quindi "la prima riga" (in base all'ordinamento impostato)... ho quindi una situazione di 1 a 1 invece che 1 a molti... proseguo il comando MERGE effettuando l'update di tabellaA...

SET NOCOUNT ON;
USE tempdb;
GO
CREATE TABLE dbo.m (
  Id int NOT NULL PRIMARY KEY,
  col1 int NOT NULL,
  col2 int NOT NULL,
  col3 int NOT NULL,
  col4 int NOT NULL,
  col5 int NOT NULL,
  col6 int NOT NULL,
  col7 int NOT NULL,
  col8 int NOT NULL,
  col9 int NOT NULL
  );
CREATE TABLE dbo.d (
  IdParent int NOT NULL,
  col1 int NOT NULL,
  col2 int NOT NULL,
  col3 int NOT NULL
  );
GO
INSERT INTO dbo.m VALUES ( 1, 1, 2, 3, 4, 5, 6, 7, 8, 9);
INSERT INTO dbo.m VALUES ( 2, 2, 3, 4, 5, 6, 7, 8, 9, 10);
INSERT INTO dbo.m VALUES ( 3, 3, 4, 5, 6, 7, 8, 9, 10, 11);
INSERT INTO dbo.d VALUES ( 1, 97, 98, 99);
INSERT INTO dbo.d VALUES ( 2, 87, 88, 89);
INSERT INTO dbo.d VALUES ( 2, 77, 78, 79);
INSERT INTO dbo.d VALUES ( 3, 97, 98, 99);
INSERT INTO dbo.d VALUES ( 3, 67, 68, 69);
INSERT INTO dbo.d VALUES ( 3, 57, 58, 59);
GO
WITH cte AS ( 
  SELECT ROW_NUMBER() OVER (PARTITION BY d.IdParent ORDER BY col1) AS [r]
    , IdParent, col1, col2, col3
  FROM dbo.d d
  )
MERGE dbo.m AS target
    USING (SELECT IdParent, col1, col2, col3
    FROM cte c
    WHERE c.r = 1) AS source 
    ON (target.Id = source.IdParent)
    WHEN MATCHED THEN 
        UPDATE SET  Target.Col7 = source.col1,
      Target.Col8 = source.col2,
      Target.Col9 = source.col3;
GO
SELECT *
  FROM dbo.m;
GO
DROP TABLE dbo.d, dbo.m;
--<-------------
Id          col1        col2        col3        col4        col5        col6        col7        col8        col9
----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- -----------
1           1           2           3           4           5           6           97          98          99
2           2           3           4           5           6           7           77          78          79
3           3           4           5           6           7           8           57          58          59


questa sintassi e' valida per SQL Server 2008 o tutti i database che supportino oltre le common table expression anche il comando ANSI di MERGE...
saluti

Andrea Montanari
http://www.hotelsole.com - http://www.hotelsole.com/asql/index.php
186 messaggi dal 25 maggio 2007
Si uso SqlServer2008.
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?
1.976 messaggi dal 27 luglio 2005
Contributi
in che senso?
saluti

Andrea Montanari
http://www.hotelsole.com - http://www.hotelsole.com/asql/index.php

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.