2011-09-09 64 views
3

現在我陷入了這個問題。我有兩個表ItemMasterItemStockItemStock表我有一列ItemId,這是外鍵ItemMaster表的Id列,每當我在ItemStock表中添加新的數量,我想那量值自動獲取與已經退出數量相加在ItemMaster的基礎上ItemIdItemStock表。在添加兩個表的列時出錯:SQL Server 2005

ItemMaster:

Id   ItemName  Quantity   
---------- ----------- ----------- 
    1   Item1  50 
    2   Item2  50 

ItemStock:

Id   ItemId  Quantity   
---------- ----------- ----------- 
    1   1   20 
    2   2   30 

查詢在SQL Server 2005:

with Developer([sum], itemid, stockid) 
as 
(
    select 
     sum(stock.quantity + isNull(im.quantity, 0)) as [sum], 
     im.id as Itemid, stock.itemid as stockid 
    from ItemMaster im 
    inner join ItemStock stock on stock.itemid = im.id 
    group by im.id, stock.itemid 
) 
update ItemMaster 
set quantity = (Select [sum] from Developer) 

導致錯誤:

Subquery returned more than 1 value. This is not permitted when the subquery follows =, !=, <, <= , >, >= or when the subquery is used as an expression.
The statement has been terminated.

任何人都可以請告訴我如何解決這個問題?

+1

是否有一個原因,爲什麼你要存儲這個值(它可能很容易過時,如果有某種方式繞過你的更新代碼)而不是使用總是會有正確值的視圖(可能是索引視圖)? –

+1

爲什麼你不使用觸發器嗎?,這可能會更容易。 – Kangkan

+0

感謝您的建議 – Dusk

回答

2

你不錯過UPDATE語句中的WHERE子句嗎?

現在,如果你做一個SELECT * FROM Developer,您可以:

sum itemid stockid 
70 1  1 
80 2  2 

而這正是錯誤說 - 該查詢返回多單結果多,究竟什麼是應該用這個做UPDATE ??它不能設置quantity列超過一個單一的值.....

只是猜測 - 你可能是這麼做的意思嗎?

;WITH Developer....... 
(
    ...... 
) 
UPDATE dbo.ItemMaster 
SET quantity = dev.sum 
FROM Developer dev 
WHERE dbo.ItemMaster.ItemId = dev.ItemId 

Developer與單行添加WHERE子句一行聯想在ItemMaster

+1

是的,你的答案正確無誤!謝謝你的幫助。 – Dusk

0

你選擇返回多個記錄,因爲你用一個簡單的加入,所以你應該插入一個where子句來過濾由id。類似的東西

select sum(stock.quantity + isNull(im.quantity,0)) as [sum], im.id as Itemid, stock.itemid as stockid from ItemMaster im inner join ItemStock stock on stock.itemid = im.id group by im.id, stock.itemid 
where im.id = @MyId and stock.itemid = @MyID2 

我也會刪除select中的其他字段,因爲你不需要它們。只留下

0

您可以創建一個視圖的總和(一個選擇更加清晰IMO):

CREATE VIEW ItemsOnHand 
WITH SCHEMABINDING 
AS 
    SELECT ItemID,SUM(Quantity) as Quantity,COUNT_BIG(*) as Cnt 
    FROM dbo.ItemStock 

這種觀點將永遠是正確的。如果性能是一個問題,您也可以索引此視圖(在ItemID)上,這意味着SQL Server會將其維護爲隱藏表,在ItemStock表中插入,刪除或更新行時自動調整數量值)