2017-02-22 65 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) 

希望幫助