2017-02-22 64 views
0

我想问一下关于SQL Server 2008的查询更新。更新表超过1行

我想用这样的查询更新多于1行的表。

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

我不是专家,但显然你的子查询的一个返回多个值。您不能将'acct_cd'设置为多个值。 –

+1

如果要更新sql server中的多行,可以使用IN运算符代替=运算符。 –

回答

0

你想分配一个值以N值从子查询返回 -

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

在子-query您选择一个以上的acc_noacc_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运算符。

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) 
+0

嗯,因为我想更新每行不同的数据 例如#temp_cost有2 grn_no与0 acct_cd ,但在acc_gltrans有2 grn_no与2 acc_no 我想更新0 acct _no与acc_gltrans 2 accno表 –

+0

它就像在excel中查找我想要做的事情 如果grn_no和凭证匹配,则检查#temp_cost中的grn_no和acc_gltrans中的凭证,然后从acc_gltrans中的acc_no更新#temp_cost中的acct_cd –

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) 

希望帮助