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