【问题标题】:SQL query and error Subquery returned more than 1 valueSQL 查询和错误子查询返回超过 1 个值
【发布时间】:2013-11-02 15:00:12
【问题描述】:

您好,这是我的 SQL 查询:

WHERE table1.Regnumber IN (
    CASE 
        WHEN @fRegNumber IS NOT NULL AND @fRegNumber<>-1 THEN @fRegNumber
        ELSE (SELECT Regnumber FROM table2)
    END
)

一个错误:

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

我该如何解决这个问题?

【问题讨论】:

  • 不管那个语法错误,很可能整个WHERE 子句中的逻辑可以重写为更合乎逻辑且更易于阅读的内容。尝试提供一些输入数据和您预期的输出数据,以及对您正在尝试执行的操作的说明。

标签: mysql sql tsql


【解决方案1】:

问题出在这个子查询上。

(SELECT Regnumber FROM table2)

它从表中返回每个 regnumber。在整个查询的上下文中,您只需选择一个。解决问题的第一步是确定您想要哪个以及为什么。

【讨论】:

  • 他在IN 子句中使用它,所以我认为他想要它们。
  • 它可能在 in 子句中,但它也在 case 结构中。
  • 那是因为他对如何正确嵌套事物感到困惑。只选择一行不是答案,它正在修复语法,就像我的回答一样。
【解决方案2】:

改为:

WHERE IF(@fRegNumber IS NOT NULL AND @fRegNumber<>-1,
         table1.Regnumber = @fRegnumber),
         table1.Regnumber IN (SELECT Regnumber FROM table2))

WHERE x IN有两种使用方式:

WHERE x IN (expr1, expr2, expr3, ...)

在这种情况下,如果您使用子查询作为表达式,它必须只返回一个值。返回多个值的子查询不会被拼接。

或:

WHERE x IN (subquery)

这是允许子查询返回多行的格式,x 将针对所有行进行测试。

由于您想要确定是针对单个值还是子查询的结果进行测试,所以您必须在IN 子句之外使用IF

可能还有其他方法可以将此查询编写为 LEFT JOIN。

【讨论】:

    【解决方案3】:

    我可以在这里看到 2 种方法。以这种方式保留CASE 声明的人:

    WHERE
        CASE    WHEN    COALESCE(@fRegNumber, -1) == -1
                THEN    t1.regnumber IN (SELECT t2.regnumber FROM table2))
                ELSE    t1.regnumber = @fRegNumber
        END
    

    另一个将整个CASE 语句改写为适当的逻辑运算符:

    WHERE
      (COALESCE(@fRegNumber, -1) != -1 AND t1.regnumber = @fRegNumber) OR
      (COALESCE(@fRegNumber, -1) == -1 AND t1.regnumber IN (SELECT t2.regnumber FROM table2))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-24
      相关资源
      最近更新 更多