更新表格超过1行

时间:2017-02-22 04:38:23

标签: sql-server sql-server-2008

我想问一下SQL Server 2008的查询更新。

我想用这样的查询更新一个包含多行的表。

update #temp_cost 
set acct_cd = (
    select acc_no from acc_gltrans 
    where voucher like 'SCS/GR%' 
    and debit_credit > 0
)
where grn_no = (
    select voucher from acc_gltrans 
    where voucher like 'SCS/GR%' 
    and debit_credit > 0
);

但是得到了这样的错误

  

子查询返回的值超过1。当子查询遵循=,!=,<,< =,>,> =或子查询用作表达式时,不允许这样做。

我希望有人可以帮我解决这个问题, 谢谢

2 个答案:

答案 0 :(得分:0)

您正在尝试使用从子查询返回的N值分配单个值 -

acct_cd = 
(select acc_no from acc_gltrans where voucher like 'SCS/GR%' 
and debit_credit > 0)

在子查询中,您从acc_no中选择了多个acc_gltrans

select acc_no from acc_gltrans where voucher like 'SCS/GR%' 
and debit_credit > 0

如果您只运行子查询并且它只返回1行,那么您可以使用TOP(1)

select TOP (1) acc_no from acc_gltrans where voucher like 'SCS/GR%' 
and debit_credit > 0

但如果您的子查询返回多行 - 我建议您重新考虑您的逻辑

此外,您正尝试更新#temp_cost中的多行 - 因此,=使用IN运算符代替{<1}}。

IN运算符将允许您更新#temp_cost表中的多个行

所以您的查询将如下所示。

update #temp_cost set 
acct_cd = 
   (select TOP (1) acc_no from acc_gltrans where voucher like 'SCS/GR%' 
       and debit_credit > 0)
where 
  -- HERE USE IN
  grn_no IN 
      (select voucher from acc_gltrans where voucher like 'SCS/GR%' 
      and debit_credit > 0)

答案 1 :(得分:0)

这里使用此

UPDATE #temp_cost As temp set 
    temp.acct_cd = A.acc_no
FROM acc_gltrans as A
WHERE A.voucher like 'SCS/GR%' AND A.debit_credit > 0)

希望帮助