子查询返回超过 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_idSubquery 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 个值。子查询遵循 =, !=, <, <= , >, >=