【问题标题】:DBO return Only one expression can be specified in the select listDBO return 选择列表中只能指定一个表达式
【发布时间】:2015-03-14 07:21:38
【问题描述】:

[_AUX] 接收来自asp 页面的值(单词'TOJ' 由表单提交)。

根据这些信息,我正在尝试创建一个触发器来更新另一个名为[dbo].[TODOS] 的表。 但我必须随机选择 只有一个 具有“false”值的行,然后将其更改为“true”。

这是我的代码:

IF EXISTS (
select top 1 A.flag
from [DBO].[_AUX] AS A 
WHERE a.flag = 'TOJ' order by a.ID_AUX desc
          ) 

update DBO.TODOS set DBO.TODOS.[TOJ_FLAG]='true' 
where  DBO.TODOS.[TOJ_FLAG] = 
  (
  select top 1 t.[toj_flag], t.TODOS
  FROM dbo.todos as t
  where t.toj_flag = 'false'
  ORDER BY NEWID()
  ) 

我收到来自 sql management studio 的错误:

消息 116,级别 16,状态 1,第 14 行

选择列表中只能指定一个表达式,当 EXISTS 没有引入子查询。

【问题讨论】:

    标签: sql sql-server


    【解决方案1】:

    在这样的语句中使用:

    IF EXISTS ( select top 1 A.flag
                from [DBO].[_AUX] AS A 
                WHERE a.flag = 'TOJ' order by a.ID_AUX desc
              ) 
    
    update DBO.TODOS set DBO.TODOS.[TOJ_FLAG]='true' 
    where  DBO.TODOS.[TOJ_FLAG] in
                               ( select t.[toj_flag]
                                 FROM dbo.todos as t
                                 where t.toj_flag = 'false'
                                 ORDER BY NEWID()
                               ) 
    

    更新:

    update DBO.TODOS set DBO.TODOS.[TOJ_FLAG]='true' 
    where  DBO.TODOS.[TOJ_FLAG] in
                               ( select t.[toj_flag]
                                 FROM dbo.todos as t
                                 where t.toj_flag = 'false'
                               ) 
    

    【讨论】:

    • 查询不工作。当我运行查询时,出现错误:ORDER BY 子句在视图、内联函数、派生表、子查询和公用表表达式中无效,除非还指定了 TOP 或 FOR XML。但我知道为什么。缺少 select top 1 参数。解决此问题后,查询运行,但现在它正在将所有行更新为“真”,而不仅仅是一个预期的行。
    • 我放弃了。我尝试了许多代码变体。但是也会出现同样的问题。所有行都更新为“真”。随机选择不适用于此查询。也许我发现了一个 sql 错误或错误。我会考虑用另一种方式来做到这一点
    猜你喜欢
    • 2012-04-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-24
    • 2018-04-14
    • 2013-12-21
    相关资源
    最近更新 更多