【问题标题】:SQL - Only one expression can be specified in the select list when the subquery is not introduced with EXISTSSQL - 当不使用 EXISTS 引入子查询时,选择列表中只能指定一个表达式
【发布时间】:2017-09-19 10:25:15
【问题描述】:

我正在尝试通过执行以下操作将变量设置为 select 语句的返回值:

declare @Owner int = 0;

set @Owner = (select distinct [TodoTitle].[owner], TodoTitle.id 
              from TodoTitle
              join todoTree on TodoTitle.id = todoTree.todoid
              where todoid = @todoId);

我不断收到此错误:

当不使用 EXISTS 引入子查询时,选择列表中只能指定一个表达式。

任何帮助将不胜感激,

标记

【问题讨论】:

  • 您正试图将两列分配给一个变量。

标签: sql sql-server


【解决方案1】:

您的子查询在结果集中必须只有一列:

set @Owner = (select distinct [TodoTitle].[owner] from TodoTitle
      join todoTree on TodoTitle.id = todoTree.todoid
      where todoid = @todoId);

子查询在结果集中必须只有一行,我不确定你的distinct 会提供这个。也许你会得到这个错误:Subquery returned more than 1 value. This is not permitted when the subquery follows =, !=, <, <= , >, >= or when the subquery is used as an expression.

【讨论】:

  • @MarkMoonieGriffiths,很高兴为您提供帮助
【解决方案2】:

您对错误消息有什么不明白的地方?您的子查询有两列。您可以通过删除其中一个轻松解决此问题:

set @Owner = (select distinct [TodoTitle].[owner]
              from TodoTitle join
                   todoTree
                   on TodoTitle.id = todoTree.todoid
              where todoid = @todoId
             );

然而,这个子查询可能返回不止一行——一个标量变量只能有一个值。您可以使用top 1 轻松解决该语法问题:

set @Owner = (select top 1 [TodoTitle].[owner], TodoTitle.id 
              from TodoTitle join
                   todoTree
                   on TodoTitle.id = todoTree.todoid
              where todoid = @todoId
             );

我猜你并不真正知道自己在做什么。你应该问另一个问题。提供样本数据、期望的结果以及您想要完成的任务的说明。您启动的 SQL 并不是特别有用。

【讨论】:

  • 对于子查询中的多行另一个错误:Subquery returned more than 1 value. This is not permitted when the subquery follows =, !=, <, <= , >, >= or when the subquery is used as an expression.
  • 使用TOP 而不使用ORDER BY 是一种不好的做法
【解决方案3】:

如果您想通过一次选择读取多个列,您可以这样编写查询。但是您的查询应该只返回一行,这就是您必须使用top 1 的原因。

declare @Owner int = 0;
declare @id int;

select top 1 @Owner = [TodoTitle].[owner], @id = TodoTitle.id 
from TodoTitle
join todoTree on TodoTitle.id = todoTree.todoid
where todoid = @todoId;

【讨论】:

    猜你喜欢
    • 2020-01-24
    • 2017-07-27
    • 2012-12-04
    • 2011-09-24
    • 2018-04-14
    相关资源
    最近更新 更多