SQL Server 子查询返回超过 1 个值。子查询遵循 =, !=, <, <= , >, >=
Posted
技术标签:
【中文标题】SQL Server 子查询返回超过 1 个值。子查询遵循 =, !=, <, <= , >, >=【英文标题】:SQL Server Subquery returned more than 1 value. the subquery follows =, !=, <, <= , >, >= 【发布时间】:2014-11-12 09:49:33 【问题描述】:当我运行下面的查询时,它显示如下错误:“SQL Server 子查询返回超过 1 个值。子查询遵循 =、!=、、>= 或当子查询为用作表达式”
SELECT TOP(1) *
FROM E_MASTER
WHERE STATUSTYPE <> 'D'
AND EMPID = 'EMP459788'
AND DEPTNO IN (SELECT DEPTNO
FROM SERVICE_MASTER
WHERE EMPNAME = '......')
AND ( DESG_CODE BETWEEN (SELECT S_DESG_CODE
FROM SERVICE_MASTER) AND (SELECT E_DESG_CODE
FROM
SERVICE_MASTER) )
【问题讨论】:
猜测SELECT E_DESG_CODE FROM SERVICE_MASTER
或SELECT S_DESG_CODE FROM SERVICE_MASTER
会返回多个值。
第一:错误消息说明您的查询有什么问题。阅读并理解它!第二:SO不是调试服务!否则:在 SELECT 列表中使用或作为参与比较的值的所有子查询都应返回一个(或无)只有一列的记录。
检查SELECT S_DESG_CODE FROM SERVICE_MASTER
或SELECT E_DESG_CODE FROM SERVICE_MASTER
是否返回多个值
【参考方案1】:
让我们看看...最可能的罪魁祸首是“between”子句。尝试查看子查询返回的内容。
(SELECT S_DESG_CODE FROM SERVICE_MASTER) AND
(SELECT E_DESG_CODE FROM SERVICE_MASTER)
您可以更改逻辑以允许子查询返回多于一行,或者根据您的要求只返回一行。
如果不知道您的关系图如何,就无法确定。 但是您可以尝试从 where 子句中删除它,并使用连接将 SERVICE_MASTER 与自身相关联。
SELECT S_DESG_CODE FROM SERVICE_MASTER sm0
join SERVICE_MASTER sm1 on sm1.E_DESG_CODE <= sm0.DESG_CODE
join SERVICE_MASTER sm2 on sm2.S_DESG_CODE >= sm0.DESG_CODE
如果您不能只使用 where 来过滤每一行。 (注意你的实际查询逻辑相当于上面的代码片段,写完之后我不确定它是否是你真正想要的)
SELECT S_DESG_CODE FROM SERVICE_MASTER
where E_DESG_CODE <= DESG_CODE and S_DESG_CODE >= DESG_CODE
【讨论】:
这真的是评论,不是答案。 @Pred:嗯,未问的 :-) 问题似乎是“我做错了什么?”答案是“您的 BETWEEN 子句中的子查询不能返回一个以上的值。更改此设置以便它们仅返回一行或更改您的逻辑以允许进行多次检查。”这是在我看来是一个答案。 帖子after编辑是一个答案,没有解释的基本提示只是我认为的评论(原帖)以上是关于SQL Server 子查询返回超过 1 个值。子查询遵循 =, !=, <, <= , >, >=的主要内容,如果未能解决你的问题,请参考以下文章