SQL Server - 子查询返回的值超过1。这是不允许的错误

时间:2018-04-20 04:56:02

标签: sql sql-server

当我运行此Sql查询时,我收到此错误。

  

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

我在我的where条件下使用IN,所以当从子查询返回多于1个值时,我不确定问题是什么。

  

如果我删除CASE语句并且只运行

    <body style="background-image: url(../../Views/Home/pexels-photo-955470.jpeg)">

</body>

然后它运作正常。

任何帮助将不胜感激。

WHERE MCO_ID IN(SELECT  MCO_ID FROM @ALL_MCO) 

4 个答案:

答案 0 :(得分:1)

在SQL CASE中是一个返回单个标量值的表达式。它不能像过程语言一样用来控制执行流程。

您可以尝试重写WHERE子句,如下所示:

WHERE 
   (@MCO = '99' AND MCO_ID IN (SELECT MCO_ID FROM @ALL_MCO))
   OR
   (@MCO != '99' AND MCO_ID = @MCO)

答案 1 :(得分:1)

您的 子句没有意义(至少对我而言),但您可以使用exists代替

SELECT *
FROM TEST_TABLE t
WHERE (@MCO = 99 AND EXISTS (SELECT 1 FROM @ALL_MCO WHERE MCO_ID = t.MCO_ID)) OR
      (@MCO <> 99 AND MCO_ID = @MCO);

但是,@MCO变量的类型为INT,因此您不需要使用单引号

答案 2 :(得分:1)

试试这个:

SELECT *
FROM TEST_TABLE
--WHERE MCO_ID IN( CASE WHEN  @MCO  ='99' THEN (SELECT  MCO_ID FROM @ALL_MCO) ELSE @MCO END)
WHERE (@MCO  ='99' AND MCO_ID IN (SELECT  MCO_ID FROM @ALL_MCO))
    OR (@MCO  !='99' AND MCO_ID = @MCO)

答案 3 :(得分:1)

这可能是你打算做的?

DECLARE @MCO INT 
SET @MCO ='99'

DECLARE @ALL_MCO TABLE
(
    MCO_ID INT
)
INSERT INTO @ALL_MCO VALUES ('1')
INSERT INTO @ALL_MCO VALUES ('2')
INSERT INTO @ALL_MCO VALUES ('3')

SELECT *
FROM TEST_TABLE
WHERE (@MCO = '99' AND MCO_ID IN (SELECT MCO_ID FROM @ALL_MCO))
   OR (@MCO <> '99' AND MCO_ID = @MCO)