子查询返回超过 1 个值。这是啥意思?

Posted

技术标签:

【中文标题】子查询返回超过 1 个值。这是啥意思?【英文标题】:Subquery returned more than 1 value. What does this mean?子查询返回超过 1 个值。这是什么意思? 【发布时间】:2021-11-07 18:45:42 【问题描述】:

有人可以帮我理解这个错误吗?我到底不能在这里做什么?

 SELECT
     CASE
         WHEN tagged_id != ' ' 
             THEN (SELECT tagged_id FROM stock) 
             ELSE ps_id 
     END AS 'Tag'
FROM
    stock

完整的错误是:

子查询返回超过 1 个值。当子查询跟随 =、!=、、>= 或子查询用作表达式时,这是不允许的。

【问题讨论】:

您到底想达到什么目的?你能分享一些样本数据和你想要得到的结果吗? 我想返回 Tagged_id,除非它是空白的,否则我想返回 ps_id。 ps_id 就像一个盒子/位置 ID,而 tagged_id 是盒子中的一个项目。 Tagged_id 有时为空,但当项目在它自己的盒子里时。所以我想返回 tagged_id 除非它是空白的,然后我想返回 ps_id Subquery returned more than 1 value 表示子查询返回了多个值,这是不允许的。为什么你有一个子查询,你是否试图从不同的行返回数据?如果是同一行,为什么需要子查询? 【参考方案1】:

您正在使用case expression - 此表达式必须产生一个单个 值。错误消息非常清楚关于问题。

您的 else 部分返回单个值 ps_id,而您的 case 表达式 的结果是一个名为 Tag 的列。

语句(select tagged_id from stock)从表中选择一列,为了符合case表达式的预期结果,这个必须返回单个值;即使 知道一个表包含单行(我敢打赌它不知道),SQL Server 直到运行时才知道这一点,但是查询在编译时被评估为在所有情况下都是有效的时间。毕竟,为单个列返回 n 个值是没有意义的,SQL Server 不允许这样做。

SQL Server 期望您显式返回单个值,例如使用 聚合函数top (1) 子句。

你也许只是想这样做

CASE WHEN tagged_id != ' ' THEN tagged_id ELSE ps_id END AS 'Tag'

【讨论】:

【参考方案2】:

您使用case 表达式的想法是正确的,但您不需要另一个子查询,因为这两个列无论如何都属于同一行:

SELECT
     CASE
         WHEN tagged_id != ' ' 
             THEN tagged_id
             ELSE ps_id 
     END AS 'Tag'
FROM
    stock

【讨论】:

【参考方案3】:

此行返回多于 1 条记录

THEN (SELECT tagged_id FROM stock)

为避免错误,您的查询必须只返回一条记录。您可以添加前 1 个

THEN (SELECT top 1 tagged_id FROM stock)

【讨论】:

旁白:Top 1 传统上伴随着order by 而不是-- Random row. 而且由于子查询不相关 - 它会从表中返回一行,而哪一行取决于 SQL Server 如何决定返回该行。【参考方案4】:

当我们尝试使用向调用查询返回多个值的子查询时会发生此错误。我通常尝试以下每个步骤。

    如果使用 SQL 作业,则启动 SQL Server Profiler 以跟踪 问题的确切位置 在您的 SELECT 语句中插入一个 TOP 1 条件 -- 这也是 过滤数据以获得唯一值。 尝试在 SQL 子查询中使用 WHERE 子句,过滤出唯一的 价值。

选择 案子 WHEN tagged_id != ' ' THEN (SELECT TOP 1 tagged_id FROM stock) 否则 ps_id 结束为“标签” 现货

【讨论】:

以上是关于子查询返回超过 1 个值。这是啥意思?的主要内容,如果未能解决你的问题,请参考以下文章

SQL Server 触发器:子查询返回超过 1 个值

存储过程生成 msg 512 子查询返回超过 1 个值

SQL Server 子查询返回超过 1 个值。子查询遵循 =, !=, <, <= , >, >=

TSQL:SELECT CASE WHEN THEN 子查询:错误:子查询返回超过 1 个值

子查询在 sqlc# 中返回超过 1 个值

选择条件列但获取子查询返回超过 1 个值