Sql server 子查询在更新无效时返回了1个以上的值

Sql server 子查询在更新无效时返回了1个以上的值,sql-server,sql-server-2008,Sql Server,Sql Server 2008,我正在尝试使用另一个表中每个项目的数量总和来更新SQL Server表 这是我的第一次尝试: UPDATE InventoryMaster SET TemporaryStock = ((SELECT coalesce(SUM(Quantity), 0) AS Total FROM InventoryTransTemp WHERE CustomerID = '0'

我正在尝试使用另一个表中每个项目的数量总和来更新SQL Server表

这是我的第一次尝试:

UPDATE InventoryMaster
SET TemporaryStock = ((SELECT coalesce(SUM(Quantity), 0) AS Total
                       FROM InventoryTransTemp
                       WHERE CustomerID = '0'
                       GROUP BY InventoryItemID) -
                      (SELECT COALESCE(SUM(Quantity), 0) AS Total
                       FROM InventoryTransTemp
                       WHERE CustomerID > 0
                       GROUP BY InventoryItemID))
下面是我使用join的第二个示例

UPDATE a 
SET a.TemporaryStock =((SELECT COALESCE(SUM(Quantity), 0) AS Total 
                        FROM InventoryTransTemp 
                        WHERE CustomerID = '0' 
                        GROUP BY InventoryItemID) - 
                       (SELECT COALESCE(SUM(Quantity), 0) AS Total 
                        FROM InventoryTransTemp  
                        WHERE CustomerID > 0 
                        GROUP BY InventoryItemID)) 
FROM InventoryMaster a 
INNER JOIN InventoryTransTemp b on a.InventoryItemID = b.InventoryItemID 

在这两种情况下,我都会得到相同的错误,我想这就是您在这里要做的。子查询的目的是计算每个库存项目的临时库存金额。我们可以将子查询移动到CTE中,然后更新join主表

WITH cte AS (
    SELECT
        InventoryItemID,
        COALESCE(SUM(CASE WHEN CustomerID = 0 THEN Quantity ELSE 0 END) -
                 SUM(CASE WHEN CustomerID > 0 THEN Quantity ELSE 0 END), 0) AS Total
    FROM InventoryTransTemp
    GROUP BY InventoryItemID
)

UPDATE a
SET TemporaryStock = b.Total
FROM InventoryMaster a
INNER JOIN cte b
    ON a.InventoryItemID = b.InventoryItemID;

请注意,主表中的inventory ID join列的名称不清楚。我假设它与临时表中的名称相同。

谢谢,先生,它工作得很好!但是如果我希望我的结果超过这两个查询呢?我需要再添加一个示例:选择InventoryItemID,CustomerID=0时合并SUMCASE,然后选择Quantity ELSE 0 END-CustomerID>0时合并SUMCASE,然后选择Quantity ELSE 0 END,按照InventoryItemID+选择InventoryItemID从InventoryTransTemp组中总计0,当CustomerID=0时合并SUMCASE,然后数量ELSE 0 END-当CustomerID>0时合并SUMCASE,然后数量ELSE 0 END,按InventoryItemId从另一个表组中总计0,但没有看到数据,我无法真正进行注释。添加另一个条件和不应中断查询。