No tiene la UPDATE FROM
sintaxis propietaria de SQL Server desactivada. Tampoco estoy seguro de por qué necesitaba unirse CommonField
y luego filtrarlo. 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 realmente tonto, como tratar constantemente de establecer el valor de una columna en el agregado de otra columna (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 realmente tonto, es que tendrá que volver a ejecutar esta actualización completa cada vez que haya una fila en los table2
cambios. A SUM
es algo que siempre se puede calcular en tiempo de ejecución y, al hacerlo, nunca tiene que preocuparse de que el resultado sea obsoleto.
UPDATE table1 a SET a.[field] = b.[field]
: eliminar el alias sí funciona, así queUPDATE table1 a SET [field] = b.[field]
UPDATE t1 INNER JOIN t2 on t2.col = t1.col SET t1.field=value WHERE t2.col=something
.Pruébalo así:
fuente
La respuesta dada por Aaron es perfecta:
Solo quiero agregar por qué ocurre este problema en SQL Server cuando tratamos de usar el alias de una tabla mientras se actualiza esa tabla, la siguiente sintaxis siempre dará error:
el caso puede ser cualquiera si está actualizando una sola tabla o actualizando mientras usa join.
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:
Espero que ayude a todos por qué el error vino aquí.
fuente
fuente
Parece que SQL Server 2012 también puede manejar la antigua sintaxis de actualización de Teradata:
Si no recuerdo mal, 2008R2 estaba dando error cuando intenté una consulta similar.
fuente
Me resulta útil convertir una ACTUALIZACIÓN en una SELECCIÓN para obtener las filas que quiero actualizar como prueba antes de actualizar. Si puedo seleccionar las filas exactas que quiero, puedo actualizar solo las filas que quiero actualizar.
fuente
Más alternativas aquí .
fuente
Otro enfoque sería usar MERGE
-Merge es parte del estándar SQL
-También estoy bastante seguro de que las actualizaciones de unión interna no son deterministas. Pregunta similar aquí, donde la respuesta habla sobre eso http://ask.sqlservercentral.com/questions/19089/updating-two-tables-using-single-query. html
fuente
MERGE
.Tuve el mismo problema ... y no necesita agregar una columna física ... porque ahora tendrá que mantenerlo ... lo que puede hacer es agregar una columna genérica en la consulta de selección:
EX:
fuente
El enfoque de Aaron anterior funcionó perfectamente para mí. Mi declaración de actualización fue ligeramente diferente porque necesitaba unirme en base a dos campos concatenados en una tabla para que coincida con un campo en otra tabla.
fuente
Tratar:
fuente
table1
, no solo las filas donde hay una coincidencia en el campo común entre ambas tablas (efectivamente, una unión izquierda y no una unión interna).BatchNo = '110'
, verdad? ¿Todos los votos negativos se produjeron como resultado de este efecto, u otros tuvieron otros motivos para rechazarlos?NULL
, y este formulario puede ser una solución menos específica de T-SQL.