获取“子查询返回超过1个值”错误运行更新查询

时间:2015-05-31 05:19:57

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

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

错误

  

Msg 512,Level 16,State 1,Line 1 Subquery返回的值超过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
                                    )
             )

3 个答案:

答案 0 :(得分:2)

错误消息表明您的一个或两个子查询返回了多行。当你将子查询用作=的操作数时,这是不允许的。解决错误的一种可能方法是在每个子查询中添加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

答案 1 :(得分:0)

错误只是建议您内部查询返回多个值 因此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 :(得分:0)

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

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

不使用任何内部选择。