我现在已经陷入了这个问题。我有两个表ItemMaster
和ItemStock
,在ItemStock
表中我有一个列ItemId
,它是Id
ItemMaster
列的外键表格,每当我在ItemStock
表格中添加新数量时,我希望该数量值会自动与基于ItemMaster
ItemId
表的ItemStock
中已退出的数量相加。
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)
导致错误:
子查询返回的值超过1。这是不允许的 子查询遵循=,!=,<,< =,>,> =或使用子查询时 作为表达。
声明已经终止。
有谁能告诉我如何解决这个问题?
答案 0 :(得分: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
添加WHERE
子句,将Developer
中的一行与ItemMaster
答案 1 :(得分:0)
你的select会返回多个记录,因为你使用了一个简单的连接,所以你应该插入一个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中的其他字段,因为您不需要它们。只留下总和(选择更清晰的imo)
答案 2 :(得分:0)
您可以创建一个视图:
CREATE VIEW ItemsOnHand
WITH SCHEMABINDING
AS
SELECT ItemID,SUM(Quantity) as Quantity,COUNT_BIG(*) as Cnt
FROM dbo.ItemStock
此视图始终是正确的。如果需要考虑性能,您还可以将此视图编入索引(在ItemID)
上,这意味着SQL Server会将其保留为隐藏表,并在{{}中插入,删除或更新行时自动调整数量值{1}}表。