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