【问题标题】:Error : Subquery returned more than 1 value错误:子查询返回超过 1 个值
【发布时间】:2013-03-07 10:26:03
【问题描述】:

我更新整个表的查询如下所示:

update works set nIndex = cast(replace(replace((select strIndex 
 from works), char(10), ''), char(10), '') as int)

但是当我运行它时,我得到了这个错误:

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

.

【问题讨论】:

    标签: sql sql-server


    【解决方案1】:

    您不需要子选择。试试这个:

    update works
         set nIndex = cast(replace(replace(strIndex, char(10), ''), char(10), '') as int)
    

    您的子选择返回所有 strIndex 的值以更新每一行。那太矫枉过正了。只需对一行内的值执行castreplace

    【讨论】:

      【解决方案2】:

      正如错误所说,您在这里返回的记录不止一条:

      select strIndex from works
      

      因此,您尝试使用works 表中的每个strIndex 值更新单个值。这行不通。

      如何让它工作真的取决于你想要做什么。由于您还没有在这里讨论,我不会推测什么会解决这个错误。

      【讨论】:

        【解决方案3】:

        您遇到的错误基本上是说您正在尝试将多个结果传递给 nIndex,因为这是以下结果: 从作品中选择strIndex

        忘记所有的演员和替换你说: nIndex = (1, 2, 3, 4,...) 这是不可能的,因为你只能给一个值。

        为此,您需要有一些限制结果的东西: 从作品中选择 strIndex WHERE PRIMARY_KEY = SOMETHING 这不是解决您的问题的有效方法,但您可以理解。

        由于两列在同一个表中,这根本没有必要,您可以简单地这样做:

        更新作品集 nIndex = cast(replace(replace(strIndex, char(10), ''), char(10), '') as int)

        【讨论】:

          【解决方案4】:

          除了其他回复之外,我怀疑您并不是要替换 char(10) 两次。您可能想要替换char(10)char(13)

          UPDATE dbo.works 
            SET nIndex = CONVERT(INT, REPLACE(REPLACE(
              strIndex, CHAR(13), ''), CHAR(10), ''));
          

          当然,由于strIndex 是一个字符串,它可能包含除CR/LF 之外的其他字符,因此您可能需要添加WHERE 子句:

          WHERE ISNUMERIC(REPLACE(REPLACE(strIndex, CHAR(13), ''), CHAR(10), '')) = 1;
          

          或者您可以在更新中使用CASE 表达式来确保将不兼容的值设置为NULL,例如:

          UPDATE dbo.works 
            SET nIndex = CASE 
              WHEN ISNUMERIC(REPLACE(REPLACE(strIndex, CHAR(13), ''), CHAR(10), '')) = 1
            THEN 
              CONVERT(INT, REPLACE(REPLACE(
              strIndex, CHAR(13), ''), CHAR(10), '')) 
            ELSE NULL END;
          

          在 SQL Server 2012 中,此逻辑要简单得多,例如TRY_CONVERT().

          【讨论】:

            【解决方案5】:

            您还可以在子查询中添加 TOP1,这将修复该错误

            update works set nIndex = cast(replace(replace((select TOP 1 strIndex 
            from works), char(10), ''), char(10), '') as int)
            

            但由于我们没有上下文,因此不保证结果是您所期望的。

            【讨论】:

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