【问题标题】:Getting "Subquery returned more than 1 value" error running update query运行更新查询时出现“子查询返回超过 1 个值”错误
【发布时间】:2015-08-13 18:27:30
【问题描述】:

请客气,我正在尝试更新 sql server 中的查询,但遇到错误。这是我在同一数据库中的两个表和下面提供的查询,我的要求是根据表 1 更新 table2 中的列 groupCode 但我面临以下错误:

错误

消息 512,级别 16,状态 1,第 1 行子查询返回超过 1 个 价值。当子查询跟随 =、!=、、>= 或子查询用作表达式时,这是不允许的。声明已终止。

表 1

**Dept**    **DeptCode**    **GroupName**   **GroupCode**
IT      32      Login-Els       1
IT      32      QC-Els          4
CT      20      Login-OUP       1
CT      20      XML-OUP         2
CT      20      QC-OUP          4
MECH    34      Login-CEN       1
MECH    34      XML-CEN         2
MECH    34      PAGINATION-CEN  3
MECH    34      QC-CEN          4

表2

**Activity**    **DeptCode**    **Group**
Login-Els       32      NULL
QC-Els          32      NULL
Login-OUP       20      NULL
XML-OUP         20      NULL
QC-OUP          20      NULL
Login-CEN       34      NULL
XML-CEN         34      NULL
PAGINATION-CEN  34      NULL
QC-CEN          34      NULL

SQL

update db1..Activity set 
Groupcode = (
                select groupcode 
                from db1..Groups 
                where DeptCode=32 
                    and Groupname = (
                                     select activity 
                                     from db1..Activity 
                                     where DeptCode=32
                                    )
             )

【问题讨论】:

  • 为什么并且一直在更新代码中

标签: sql-server sql-server-2008 sql-update insert-update


【解决方案1】:

错误只是建议您内部查询返回多个值 因此 sql 变得混乱。所以防止我使用 top cluase

的多个值

试试这个..

update db1..Activity set 
Groupcode =(select top 1 groupcode from db1..Groups where DeptCode=32 and 
Groupname =(select top 1 activity from db1..Activity where DeptCode=32))

【讨论】:

    【解决方案2】:

    您必须始终更新,以便内部选择始终返回一行。您的示例与示例表并不真正匹配,但也许这就是您想要的:

    update
      Table2
    set
      Group = (
        select
          GroupCode
        from
          table1
        where
          table1.DeptCode = table2.DeptCode and
          table1.GroupName = table2.Activity
      )
    

    这部分真的没有意义:

    Groupname =(select activity from db1..Activity where DeptCode=32))
    

    因为您正在尝试从自身更新表格,如果确实如此,那么您可以使用:

    update table2 set GroupName = Activity
    

    不使用任何内部选择。

    【讨论】:

    • 感谢 har07、dhaval、jamesZ 和大家的好建议
    【解决方案3】:

    错误消息表明您的一个或两个子查询返回了多行。这是不允许的,因为您将子查询用作= 的操作数。修复错误的一种可能方法是将TOP 1 添加到您的每个子查询中。

    完成此类更新任务的另一种可能方法是使用UPDATE ... FROM ... JOIN 语法,如下所示:

    UPDATE Activity
    SET Groupcode = G.groupcode
    FROM Activity A
        INNER JOIN Groups G 
            ON A.activity = G.Groupname
               AND A.DeptCode = G.DeptCode
    WHERE A.DeptCode = 32
    

    【讨论】:

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