【问题标题】:Table Variables with an Alias in a Delete From StatementDelete From 语句中带有别名的表变量
【发布时间】:2009-02-28 04:56:50
【问题描述】:

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

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

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

【问题讨论】:

    标签: sql sql-server alias


    【解决方案1】:

    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)
    


    结果

    【讨论】:

    • 哇,不知道这个语法!如果您没有粘贴图像,我会以无效为由拒绝。这适用于 SQL2000 还是仅适用于 SQL Server 2005?我现在在家,所以无法直接验证。
    • 它应该可以在 SQL 2k/2k5/2k8 上运行(它在屏幕截图上的 2k8 上测试过) - 从未处理过 SQL 7,所以不确定 7
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-17
      • 2015-06-04
      • 2021-10-26
      • 2012-09-12
      • 2014-04-15
      • 1970-01-01
      • 1970-01-01
      • 2023-03-07
      相关资源
      最近更新 更多