代码之家  ›  专栏  ›  技术社区  ›  Jeff B

在更新期间从旧表和最终表中选择值

  •  1
  • Jeff B  · 技术社区  · 6 年前

    我写了一份更新声明 @CHANGE (正整数值或负整数值)并更新 CURRENT_INVENTORY 对于该类型的项目。

    UPDATE ITEM_INVENTORY
    SET    CURRENT_INVENTORY = MAX(CURRENT_INVENTORY + @CHANGE, 0),
           LAST_UPD_TSTAMP = CURRENT_TIMESTAMP,
           LAST_UPD_SOURCE = @SOURCE
    WHERE  LOCATION = @LOCATION
           AND ITEM_TYPE = @ITEM_TYPE;
    

    我想知道什么 当前库存 OLD TABLE FINAL TABLE 的价值 当前库存 ?

    我想显示一条消息,内容是“{location}inventory从{old}更改为{new}”。我可以使用一个单独的SELECT来获取旧的/当前的值,在代码中进行计算,然后更新表中的行。不过,我相信这很容易受到竞争条件的影响(因为第一个SELECT不会锁定行),所以我尝试在一个查询中完成它。

    1. 从中选择值 旧桌子
    2. 从中选择值 旧桌子 并选择新值(在同一事务中,因为我的更新已锁定该行)

    有没有更好/正确的方法来实现这一点?

    2 回复  |  直到 6 年前
        1
  •  3
  •   Paul Vernon    6 年前

    您可以使用“从更新中选择”(SQL手册)。 例子:

    SELECT EMPNO, SALARY, BONUS , OLD_SALARY , OLD_BONUS
        FROM FINAL TABLE
            (UPDATE EMP  INCLUDE  ( OLD_SALARY DECIMAL(9,2)
                                  , OLD_BONUS DECIMAL(9,2))
            SET SALARY     = SALARY+1000
            ,   BONUS      = 0
            ,   OLD_SALARY = SALARY
            ,   OLD_BONUS  = BONUS
            WHERE SALARY > 28000);
    
        2
  •  1
  •   Lukasz Szozda    6 年前

    更新内联视图而不是表:

    SELECT CURRENT_INVENTORY, CURRENT_INVENTORY_OLD
    FROM FINAL TABLE(
      UPDATE (SELECT *, CURRENT_INVENTORY AS CURRENT_INVENTORY_OLD 
              FROM ITEM_INVENTORY)
      SET CURRENT_INVENTORY = CASE 
                                 WHEN CURRENT_INVENTORY + @CHANGE < 0 THEN 0
                                 ELSE CURRENT_INVENTORY + @CHANGE
                               END,
           LAST_UPD_TSTAMP = CURRENT_TIMESTAMP,
           LAST_UPD_SOURCE = @SOURCE
      WHERE LOCATION = @LOCATION
        AND ITEM_TYPE = @ITEM_TYPE
    );