¿Actualizar una tabla usando JOIN en SQL Server?
Quiero actualizar una columna en una tabla haciendo una combinación en otra tabla, por ejemplo:
UPDATE table1 a
INNER JOIN table2 b ON a.commonfield = b.[common field]
SET a.CalculatedColumn= b.[Calculated Column]
WHERE
b.[common field]= a.commonfield
AND a.BatchNO = '110'
Pero se queja:
Mensaje 170, nivel 15, estado 1, línea 2
Línea 2: sintaxis incorrecta cerca de 'a'.
¿Que esta mal aquí?
No tienes UPDATE FROM
la sintaxis propietaria de SQL Server. Tampoco estoy seguro de por qué necesitabas unirte CommonField
y filtrarlo después. Prueba esto:
UPDATE t1
SET t1.CalculatedColumn = t2.[Calculated Column]
FROM dbo.Table1 AS t1
INNER JOIN dbo.Table2 AS t2
ON t1.CommonField = t2.[Common Field]
WHERE t1.BatchNo = '110';
Si está haciendo algo tonto, como intentar constantemente establecer el valor de una columna en el agregado de otra columna (lo que viola el principio de evitar el almacenamiento de datos redundantes), puede usar un CTE (expresión de tabla común); consulte aquí y aquí para más detalles:
;WITH t2 AS
(
SELECT [key], CalculatedColumn = SUM(some_column)
FROM dbo.table2
GROUP BY [key]
)
UPDATE t1
SET t1.CalculatedColumn = t2.CalculatedColumn
FROM dbo.table1 AS t1
INNER JOIN t2
ON t1.[key] = t2.[key];
La razón por la que esto es una tontería es que tendrás que volver a ejecutar esta actualización completa cada vez que cambie una fila table2
. A SUM
es algo que siempre puedes calcular en tiempo de ejecución y, al hacerlo, nunca tendrás que preocuparte de que el resultado esté obsoleto.
La respuesta dada anteriormente por Aaron es perfecta:
UPDATE a
SET a.CalculatedColumn = b.[Calculated Column]
FROM Table1 AS a
INNER JOIN Table2 AS b
ON a.CommonField = b.[Common Field]
WHERE a.BatchNo = '110';
Solo quiero agregar por qué ocurre este problema en SQL Server cuando intentamos usar el alias de una tabla mientras actualizamos esa tabla; la sintaxis que se menciona a continuación siempre dará error:
update tableName t
set t.name = 'books new'
where t.id = 1
El caso puede ser cualquiera si está actualizando una sola tabla o actualizando mientras usa unirse.
Aunque la consulta anterior funcionará bien en PL/SQL pero no en SQL Server.
La forma correcta de actualizar una tabla mientras se usa el alias de tabla en SQL Server es:
update t
set t.name = 'books new'
from tableName t
where t.id = 1
Espero que ayude a todos por qué apareció el error aquí.