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

Posted

技术标签:

【中文标题】SQL - 当不使用 EXISTS 引入子查询时,选择列表中只能指定一个表达式【英文标题】:SQL - Only one expression can be specified in the select list when the subquery is not introduced with 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 引入子查询时,选择列表中只能指定一个表达式。

任何帮助将不胜感激,

标记

【问题讨论】:

您正试图将两列分配给一个变量。 【参考方案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;

【讨论】:

以上是关于SQL - 当不使用 EXISTS 引入子查询时,选择列表中只能指定一个表达式的主要内容,如果未能解决你的问题,请参考以下文章

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

创建函数时出错 - 如果不使用 EXISTS 引入子查询,则选择列表中只能指定一个表达式

sql语句中如何用 EXISTS 引入子查询?没有exists引入子查询时怎样实现子查询?

不使用EXISTS引入子查询时,选择列表中只能指定一个表达式--sql中的错误

EXISTS(sql server 2014)不引入子查询时,选择列表中只能指定一个表达式

SQL Server 错误:当子查询没有用 EXISTS 引入时,选择列表中只能指定一个表达式