¿Actualizar una tabla usando JOIN en SQL Server?

Resuelto Manjot asked hace 14 años • 13 respuestas

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í?

Manjot avatar Oct 22 '09 05:10 Manjot
Aceptado

No tienes UPDATE FROMla sintaxis propietaria de SQL Server. Tampoco estoy seguro de por qué necesitabas unirte CommonFieldy 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 SUMes algo que siempre puedes calcular en tiempo de ejecución y, al hacerlo, nunca tendrás que preocuparte de que el resultado esté obsoleto.

Aaron Bertrand avatar Oct 21 '2009 23:10 Aaron Bertrand

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í.

Ankur Bhutani avatar Apr 16 '2013 19:04 Ankur Bhutani