when w3schools usar update matched from ejemplo como and sql sql-server tsql sql-server-2008 merge

w3schools - update select mysql



Problemas con la sentencia MERGE de SQL Server (2)

Cualquiera de los cuatro valores en #S coincidirá con el valor de una sola fila de la tabla de destino (todos los valores en #S tienen id = 1 y nombre = ''A'', por lo que todos coinciden con la única fila en el destino), por lo que este valor será actualizado cuatro veces, eso es lo que dice el error, y es absolutamente correcto.

¿Qué es lo que realmente quieres lograr aquí?

¿Desea establecer la dirección en el primero de los valores de la tabla de origen? Use una cláusula TOP 1 en su subselección:

MERGE #T USING (SELECT TOP 1 id, name, address FROM #S) AS S ON #T.id = S.id AND #T.Name = S.Name WHEN NOT MATCHED THEN INSERT VALUES(S.id,S.Name, S.Address) WHEN MATCHED THEN UPDATE SET Address = S.Address;

¿Desea establecer la dirección en un elemento aleatorio de los valores de la tabla de origen? Use una cláusula TOP 1 y ORDER BY NEWID() en su subselección:

MERGE #T USING (SELECT TOP 1 id, name, address FROM #S ORDER BY NEWID()) AS S ON #T.id = S.id AND #T.Name = S.Name WHEN NOT MATCHED THEN INSERT VALUES(S.id,S.Name, S.Address) WHEN MATCHED THEN UPDATE SET Address = S.Address;

Si combina cuatro filas de origen en una sola fila de destino, nunca obtendrá un resultado útil: necesita saber lo que realmente desea.

Bagazo

Tabla fuente

Id, Name, Address 1 A #202 1 A #203 1 A #204 2 A #202

Tabla objetivo

Id, Name, Address 1 A NULL

Después de fusionar

Id, Name, Address 1 A #202 2 A #202

Estoy usando este SQL

create table #S (ID int, Name varchar(25) NULL, Address varchar(25) NULL) create table #T (ID int, Name varchar(25) NULL, Address varchar(25) NULL) INSERT #S values(1, ''A'', ''#202'') INSERT #S values(1, ''A'', ''#203'') INSERT #S values(1, ''A'', ''#203'') INSERT #S values(1, ''A'', ''#204'') INSERT #T values(1, ''A'', NULL) MERGE #T USING ( Select id, name, address from #S ) AS S(id,name,address) on #T.id=S.id and #T.Name=S.Name when not matched THEN INSERT values(S.id,S.Name, S.Address) when matched then update set Address = S.Address; GO Select * from #T GO Select * from #S GO

Esto provoca un error

Mensaje 8672, Nivel 16, Estado 1, Línea 18
La instrucción MERGE intentó ACTUALIZAR o BORRAR la misma fila más de una vez. Esto sucede cuando una fila de destino coincide con más de una fila de origen. Una instrucción MERGE no puede ACTUALIZAR / BORRAR la misma fila de la tabla de destino varias veces. Refine la cláusula ON para asegurarse de que una fila de destino coincida en la mayoría de una fila de origen, o use la cláusula GROUP BY para agrupar las filas de origen.

Quiero actualizar la fila en A con el valor de Dirección de cualquiera de los tres valores coincidentes. ¿Como hacer esto?


Quitar el dupicate usando

select R.* from (SELECT Customer,Material,Received_date_time, row_number() over (Partition by Customer, Material order by Customer,Material,Received_date_time) as rn from Customer_Table WHERE Status=0 ) as R where R.rn = 1

para fusionar no puede tener duplicados, por lo que siempre tiene que recoger los últimos