请温柔,我正在尝试更新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
)
)
答案 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
不使用任何内部选择。