2009-02-28 67 views
40

我想根据同一个表中其他行的存在删除SQL Server 2000/2005表变量中的行(如果非0计数删除所有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服务器接受该表变量的01别名(我认为一个别名,需要因“o1.Month = o2.Month”匹配字段名称)。错误是:

消息102,15级,状态1,11号线

附近有语法错误 '01'。

回答

52

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) 


结果

alt text

+0

哇,不知道这个语法!如果你没有粘贴图片,我会拒绝它作为无效。这是否适用于SQL2000或仅适用于SQL Server 2005?我现在在家,所以无法直接验证。 – 2009-02-28 05:28:44

8

试试这个,它应该工作(第一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,如解释here,期望一个没有别名的表冷杉t,一个可选的FROM可以在它之前。之后,你可以在第二个FROM的表中放置一个别名,如果你需要做一个JOIN,子查询等。