如何在SQL Server 2008中使用表别名编写UPDATE SQL?


212

我有一个非常基本的UPDATE SQL-

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

该查询运行良好的OracleDerbyMySQL-但它在SQL Server 2008中失败 与以下错误:

“消息102,级别15,状态1,行1'Q'附近的语法不正确。

如果我从SQL中删除所有出现的别名“ Q”,那么它将起作用。

但是我需要使用别名。


5
为什么需要使用别名?似乎您不需要它。
马克·拜尔斯

5
是的-从编程角度来看,我不需要它。但是我有一个现有的/旧的库,该库可以生成带有表别名的所有DML SQL。该库有许多类,它们具有一种复杂的逻辑。现在,摆脱库中的表别名比调整现有逻辑以使其适用于MSSQL更为艰巨。另外,当涉及多个表时,我确实需要使用表别名。
javauser71 2011年

Answers:


421

在SQL Server的更新语句中使用别名的语法如下:

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

不过,在这里别名不是必需的。


2
是的!有用。感谢您及时的回复。您有任何机会知道为什么MSSQL Server支持这种非常规语法进行更新吗?
javauser71 2011年

3
马克·拜尔斯-好答案!!此语法使我可以添加注释掉的Select语句,该语句使我可以通过首先执行select来测试更新(从select向下突出显示并执行):SET Q.TITLE = 'TEST' -- SELECT *

2
真好 这使得在where子句中使用intellisense更容易。
Magnus 2015年

那不是别名。那只是完全限定的“ table.column”名称:-/
ScottWelker,

17

您始终可以采用CTE(通用表格表达式)方法。

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

UPDATE updateCTE
SET TITLE = 'TEST';

是的-它也可以。但是对于JDBC / Java程序,这是一种复杂的语法。感谢您的答复。
javauser71 2011年

-1

Postgres的特殊情况

上述解决方案列表对我不起作用。因此,这里是Postgres的解决方案

由于我是大火,我的查询

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

结果:错误:关系“表”的列“ q”不存在

解决方案是您不需要在SET数据值上使用allis

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

嗨,Ronak,您对您的答案不满意,因为它是针对Postgres的,并且上面已经有针对T-SQL的有效解决方案。
AlpiMurányi

hii @AlpiMurányi您可以向我建议哪种情况下可行的解决方案。这样我就可以实施了,已经在我的回答中提到了错误
Ronak Patel
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.