添加两个表的列时出错:SQL Server 2005

时间:2011-09-09 06:29:11

标签: sql sql-server-2005 tsql

我现在已经陷入了这个问题。我有两个表ItemMasterItemStock,在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。这是不允许的   子查询遵循=,!=,<,< =,>,> =或使用子查询时   作为表达。
  声明已经终止。

有谁能告诉我如何解决这个问题?

3 个答案:

答案 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}}表。