为什么我不能在DELETE语句中使用别名?


158

在Visual Studio 2010的SQL Server Compact Edition中(也许我不知道SQL Server和SQL),此命令有效:

DELETE FROM foods WHERE (name IN ('chickens', 'rabbits'))

但是此命令产生以下错误: Error near identifier f. Expecting OUTPUT.

DELETE FROM foods f WHERE (f.name IN ('chickens', 'rabbits'))

@ aaron-bertrand感谢您也更正了我的头衔。我没有意识到我所发布内容的正确用语(否则Google可能很快就解决了这个问题)。再次感谢你。
里卡多·阿尔塔米拉诺

别担心。只是想让其他读者明白。
亚伦·伯特兰

我确实同意您的观点,即不同命令之间的语法变化有时有点不直观。
亚伦·伯特兰

这是同样的问题,但对于UPDATE语句:stackoverflow.com/questions/31551/...
丹尼尔·尼尔

Answers:


239

要为表添加别名,您必须说:

DELETE f FROM dbo.foods AS f WHERE f.name IN (...);

我看不到该特定DELETE语句的别名,尤其是因为(至少是IIRC)这不再符合严格的ANSI。但是,是的,正如评论所建议的,可能需要其他查询形式(例如,相关性)。


2
我主要只是好奇,因为我通常在使用SELECT和其他这样的语句时使用别名,所以我本能地执行了我习惯的操作,并且想知道为什么它不能正常工作。
里卡多·阿尔塔米拉诺

41
+1在OP的情况下,可能不需要别名,但是这对我有所帮助,因为我使用的是EXISTS子句,因此我必须对表进行别名,以便将两个查询绑定在一起。
里卡多

4
我在寻找现有的SELECT查询并将其快速转换为DELETE语句而不必重写别名时正在寻找一种解决方案。
亚历克斯(Alex)

4
重要的用例示例;根据涉及多个列的第二张表的内容删除(即,这样innot in那样行不通:DELETE f from dbo.foods as f where not exists (select top 1 1 from animalDiets a where a.AnimalId = f.AnimalId and a.DietId = f.DietId)
JohnLBevan '16

3
当您要从表中删除但需要将该表连接到其他表/视图以减少行集时,使用别名进行删除非常有用。例如delete o from Order as o inner join Customer as c on c.CustomerID = o.CustomerID where c.ArchiveOrders = 1
安德鲁·詹斯

74

delete语句的语法很奇怪。它是这样的:

DELETE f FROM foods f WHERE (f.name IN ('chickens', 'rabbits'))

1
@Ricardo唯一的区别是架构。但是时间表明两者是同时发布的。
Mukus 2014年
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.