【问题标题】:How to update table based on values in another table如何根据另一个表中的值更新表
【发布时间】:2016-07-15 19:09:17
【问题描述】:

我根据下面的架构想知道

如何根据orderDetail 表中的产品数量值更新库存缺货值。

例如我有以下示例数据

订单详情

Order-id Product-id   Qty
1          1           5

库存

 Inventory-id  Date      Product-id  In-stock  Out-stock stock-left 
 1             1/1/2016   1           10        5         5

让我们说在订单明细表中的数量值更改为 1,我如何在库存表中也将其更改为 1。

架构

【问题讨论】:

  • 可能数据库触发器可以帮助解决这个问题。你考虑过这个选项吗?
  • 没有和我的情况类似的例子谢谢
  • 我认为问题在于您的设计存在缺陷。没有理由将售出的库存数量存储在库存表中。该值可以而且应该在您需要时使用订单信息实时计算。考虑一下当您将东西退回等时这会变得多么复杂......您需要在此处修复关系模型。

标签: sql sql-server sql-server-2008


【解决方案1】:

您可以使用触发器来传播值

CREATE TRIGGER [dbo].[inventory_update] ON [dbo].[OrderDetail]
    FOR UPDATE
    AS
    BEGIN

        UPDATE Inventory
        SET OutStock = inserted.Qty
        FROM inserted
        WHERE Inventory.inventory-id = inserted.inventory-id

    END

【讨论】:

  • 你可能猜到错误是Inventory.inventory-id没有定义。
【解决方案2】:

在此处使用 Upsert wold 帮助

MERGE INTO tablename USING table_reference ON (condition)
WHEN MATCHED THEN
UPDATE SET column1 = value1 [, column2 = value2 ...]
WHEN NOT MATCHED THEN
INSERT (column1 [, column2 ...]) VALUES (value1 [, value2 ...]);

【讨论】:

    【解决方案3】:

    首先,我要说的是,计算成员不应该用作表中的属性。例如 => 库存 =(总数量)-(已售数量)。这应该是一个计算成员,只不过是SQL 中的表达式。

    顺便说一句,您仍然可以使用 UPDATE TRIGGER 解决此问题

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-11-27
      • 2023-03-26
      • 1970-01-01
      • 1970-01-01
      • 2012-09-05
      • 2019-08-20
      相关资源
      最近更新 更多