【问题标题】:SQL Server - Subquery returned more than 1 value. This is not permitted errorSQL Server - 子查询返回超过 1 个值。这是不允许的错误
【发布时间】:2018-04-20 04:56:01
【问题描述】:

当我运行这个 Sql 查询时,我得到了这个错误。

"子查询返回超过 1 个值。当 子查询遵循 =、!=、、>= 或当子查询用作 一个表达式。”

我在 where 条件中使用 IN,所以当它从子查询返回超过 1 个值时,我不确定问题出在哪里。

如果我删除 CASE 语句并使用

WHERE MCO_ID IN(SELECT  MCO_ID FROM @ALL_MCO) 

然后它就可以正常工作了。

任何帮助将不胜感激。

DECLARE @MCO INT 
SET @MCO ='99'  -- This will be dynamic variable. I am just setting here for example 

DECLARE @ALL_MCO TABLE
(
    MCO_VALUE 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_ID IN ( 
                 CASE WHEN  @MCO  ='99' THEN 
                      (SELECT  MCO_VALUE FROM @ALL_MCO)
                   ELSE 
                       @MCO END
                )

【问题讨论】:

  • 你想用子查询'SELECT MCO_ID FROM @ALL_MCO'做什么?在这种情况下返回多个值是没有意义的,因此会出现错误。
  • @jp2g 使用 'SELECT MCO_ID FROM ALL_MCO' 我试图获取我在表变量中插入的所有 3 个 MCO_VALUE。我需要那个,因为我将在 MCO 变量中传递多个值。如果我通过“99”,我需要查询所有 MCO 值。在某些情况下,我只会在 MCO 中获得除 99 之外的特定值,因此我想在 else 条件下查询该特定 MCO_VALUE。关于错误。我正在使用 IN 运算符,因此它应该在 WHERE 条件下接受超过 1 个值。
  • 我在发帖时出错,并为表变量和条件“MCO_ID”提供了相同的名称。我已将表变量更改为 MCO_VALUE。 (这不是实际查询的错误,只是这里的错字)

标签: sql sql-server


【解决方案1】:

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

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

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

【讨论】:

  • 谢谢。它对我有用,现在我明白了关于......当子查询用作表达式时的错误消息。
【解决方案2】:

您的 where 子句没有意义(至少对我而言),但您可以改用 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 类型,所以你不需要使用单引号

【讨论】:

    【解决方案3】:

    试试这个:

    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)
    

    【讨论】:

    • 谢谢。从你的回答中也得到了这个概念。
    【解决方案4】:

    这大概就是你的本意吧?

    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)
    

    【讨论】:

    • 谢谢。从您的回答中也得到了这个概念。
    猜你喜欢
    • 2011-02-08
    • 1970-01-01
    • 1970-01-01
    • 2014-10-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多