在删除语句中带有别名的表variables

我想根据同一个表中其他行的存在删除SQL Server 2000/2005表variables中的行(如果非0行数存在且date相同,则删除所有0行数)。 这是一个简单的例子,应该只删除首先添加的行:

declare @O table ( Month datetime, ACount int NULL ) insert into @O values ('2009-01-01', 0) insert into @O values ('2009-01-01', 1) insert into @O values ('2008-01-01', 1) insert into @O values ('2007-01-01', 0) delete from @O o1 where ACount = 0 and exists (select Month from @O o2 where o1.Month = o2.Month and o2.ACount > 0) 

问题是,我不能让SQL服务器接受表variables的o1别名(我认为由于“ o1.Month = o2.Month ”匹配字段名称而需要别名)。 错误是:

Msg 102,Level 15,State 1,Line 11

'o1'附近的语法不正确。

FROM语句之前指定别名名称含义是从别名表中删除。

 delete o1 from @O as o1 where ACount = 0 and exists ( select Month from @O o2 where o1.Month = o2.Month and o2.ACount > 0) 

结果

替代文字

试试这个,它应该工作(第一个FROM是可选的):

 DELETE [FROM] @O FROM @O o1 where ACount = 0 and exists (select Month from @O o2 where o1.Month = o2.Month and o2.ACount > 0) 

理由是:DELETE,正如这里所解释的那样,首先需要一个非别名表,一个可选的FROM可以在它之前。 在那之后你可以在第二个FROM表中放置一个别名,如果你需要做JOIN,子查询等等。