¿Cómo escribir ACTUALIZAR SQL con alias de tabla en SQL Server 2008?

212

Tengo un muy básico UPDATE SQL-

UPDATE HOLD_TABLE Q SET Q.TITLE = 'TEST' WHERE Q.ID = 101;

Esta consulta se ejecuta bien en Oracle, Derby, MySQL- pero no en el servidor SQL 2008 con el siguiente error:

"Mensaje 102, Nivel 15, Estado 1, Línea 1 Sintaxis incorrecta cerca de 'Q'".

Si elimino todas las apariciones del alias, "Q" de SQL, entonces funciona.

Pero necesito usar el alias.

javauser71
fuente
55
¿Por qué necesitas usar un alias? No parece que lo necesites.
Mark Byers
55
Sí, desde la perspectiva de la programación no lo necesito. Pero tengo una biblioteca existente / antigua que genera todo tipo de SQL DML con alias de tabla. La biblioteca tiene muchas clases con una especie de lógica compleja. Ahora deshacerse de los alias de tabla en la biblioteca es más trabajo que ajustar la lógica existente para que funcione para MSSQL. Además, cuando hay varias tablas involucradas, necesito tener un alias de tabla.
javauser71

Respuestas:

421

La sintaxis para usar un alias en una declaración de actualización en SQL Server es la siguiente:

UPDATE Q
SET Q.TITLE = 'TEST'
FROM HOLD_TABLE Q
WHERE Q.ID = 101;

Sin embargo, el alias no debería ser necesario aquí.

Mark Byers
fuente
2
Si !!! Funciona. Gracias por la rápida respuesta. ¿Por casualidad sabe por qué el servidor MSSQL admite una sintaxis tan poco convencional para la actualización?
javauser71
3
Mark Byers - ¡Gran respuesta! Esta sintaxis me permite agregar una declaración Select comentada, que me permite probar la actualización haciendo primero la selección (resaltar desde la selección hacia abajo y ejecutar):SET Q.TITLE = 'TEST' -- SELECT *
2
Agradable. Esto facilita el uso de intellisense en la cláusula where.
Magnus
Eso no es un alias. Ese es solo el nombre completo de 'table.column': - /
ScottWelker
17

Siempre puede tomar el enfoque CTE , (expresión tabular común).

;WITH updateCTE AS
(
    SELECT ID, TITLE 
    FROM HOLD_TABLE
    WHERE ID = 101
)

UPDATE updateCTE
SET TITLE = 'TEST';
Ryk
fuente
Sí, también funciona. Pero para un programa JDBC / Java, este es un tipo de sintaxis compleja. Gracias por su respuesta.
javauser71
-1

Caso especial para Postgres

Una lista de las soluciones anteriores no funcionaría para mí. Entonces, aquí la solución para Postgres

Como soy un fuego mi consulta

UPDATE table Q SET Q.is_active = FALSE ,Q.is_delete = TRUE WHERE Q.name = 'XYZ';

Resultado: ERROR: la columna "q" de la relación "tabla" no existe

Solución Sería que no necesita usar allis en SET data value

UPDATE table Q SET is_active = FALSE ,is_delete = TRUE WHERE Q.name = 'XYZ';
Ronak Patel
fuente
Hola Ronak, rechazo tu respuesta como lo es para Postgres y ya hay una solución de trabajo para T-SQL arriba.
Alpi Murányi
hii @ AlpiMurányi, ¿puede sugerirme cuál es la solución que funciona en mi caso? para que pueda implementar, ya mencioné el error en mi respuesta
Ronak Patel