SQL - 比较2个计数值以更新“完成”字段

时间:2015-03-02 10:10:04

标签: sql sql-server sql-server-2012

示例场景:

  • 订单有5个项目
  • 每个项目都有一个单独的位列,用于确定它们是否已被接收。 ( ItemReceived PartsTable
  • 收到所有5个项目后,我想更新 OrdersTable
  • 中的( OrderComplete )字段

我知道下面的代码不起作用,但这是我想要实现的一个例子:

UPDATE OrdersTable SET OrderComplete = 1  
FROM PartsTable 
WHERE
     OrdersTable.OrderID = (SELECT TOP 1 OrderID FROM OrdersTable ORDER BY changedate DESC) 
AND 
    COUNT(PartsTable.ItemReceived) = COUNT(PartsTable.EquipmentID)

所以当每个单独的部分都设置为已收到( ItemReceived )时,我希望COUNT函数将此列与 EquipmentID 进行比较

示例1

  • 已收到4个零件( ItemsReceived = 4
  • 1部分尚未收到
  • COUNT(PartsTable.ItemReceived) 4 = COUNT(PartsTable.EquipmentID) 5

在这种情况下,4不等于5,所以没有任何反应

示例2

  • 已收到5个零件( ItemsReceived = 5
  • 0部件尚未收到
  • COUNT(PartsTable.ItemReceived) 5 = COUNT(PartsTable.EquipmentID) 5

在这种情况下,5等于5,所以 OrderComplete 应该等于 TRUE

感谢您对此问题的任何帮助

1 个答案:

答案 0 :(得分:1)

您可以使用NOT EXISTS代替COUNT

当没有等待接收的部分时,这将UPDATE全部Orders完成。如果还有一个或多个部件仍在等待接收,那么订单将不会更新以完成。

NOT EXISTS中的加入可能不正确,因为我不确定OrdersTable如何链接到PartsTable,但它应该让您朝着正确的方向前进。

UPDATE
    OrdersTable

SET
    OrderComplete = 'TRUE'

FROM
    OrdersTable

WHERE
    NOT EXISTS
    (
        SELECT  *
        FROM    PartsTable
        WHERE   ItemReceived = 'FALSE'
                AND OrdersTable.Id = PartsTable.Id
    )