41

我想根据同一个表中其他行的存在从 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 服务器接受表变量的 o1 别名(我认为由于“ o1.Month = o2.Month”匹配的字段名称而需要别名)。错误是:

消息 102,第 15 级,状态 1,第 11 行

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

4

2 回答 2

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)


结果

替代文字

于 2009-02-28T05:05:40.520 回答
9

试试这个,它应该可以工作(第一个 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 可以在它之前。之后,如果您需要执行 JOIN、子查询等,您可以在第二个 FROM 中的表上放置别名。

于 2009-02-28T05:09:18.717 回答