代码之家  ›  专栏  ›  技术社区  ›  SausageBuscuit

PL/SQL-使用另一个表中的值更新具有最大日期的行

  •  1
  • SausageBuscuit  · 技术社区  · 7 年前

    我有一个Oracle数据库,其中有两个表,如下所示。

    ITEMS
    
    ITEM_ID  |  ITEM_DESC     |   ITEM_STATUS
    ============================================
    1        |  ITEM 1        |       A
    2        |  ITEM 2        |       A
    3        |  ITEM 3        |       I
    4        |  ITEM 4        |       A
    
    ITEM_UPDATES
    
    ITEM_ID  |  LAST_CHANGE     |   ITEM_STATUS
    =============================================
    1        |  1/21/2010       |
    1        |  4/1/2015        |
    2        |  1/21/2010       |
    2        |  7/14/2016       |
    3        |  1/21/2010       |
    3        |  10/21/2011      |
    3        |  11/15/2017      |
    4        |  11/30/2010      |
    

    我们想更改跟踪此系统中项目状态的方式,我正试图将项目状态列移到项目更新表。过去发生的事情无关紧要,并且可能具有唯一的状态,但是我想为每个记录设置ITEM_status,并将给定ID的MAX(上次更改)设置为ITEMS中当前ITEM_status列的值。所以基本上,完成的桌子会是这样的。

    项目更新

    ITEM_ID  |  LAST_CHANGE     |   ITEM_STATUS
    =============================================
    1        |  1/21/2010       |       
    1        |  4/1/2015        |       A
    2        |  1/21/2010       |
    2        |  7/14/2016       |       A
    3        |  1/21/2010       |
    3        |  10/21/2011      |
    3        |  11/15/2017      |       I
    4        |  11/30/2010      |       A
    

    我有一个查询来选择下面的正确数据,但是我不知道如何将其转换为update语句,因为我必须比较项id,以及是否有某个项是该项的最大日期记录。这可行吗?

      SELECT ITEM_UPDATES.ITEM_ID, ITEMS.ITEM_STATUS, MAX(EFFECTIVE_DATE) AS MAX_DATE
        FROM ITEM_UPDATES, ITEMS
       WHERE ITEM_UPDATES.ITEM_ID = ITEMS.ITEM_ID  
    GROUP BY ITEM_UPDATES.ITEM_ID, ITEMS.ITEM_STATUS
    
    2 回复  |  直到 7 年前
        1
  •  1
  •   Gordon Linoff    7 年前

    所以你想更新最近的状态 item_updates 记录。你可以:

    update item_updates iu
        set item_status = (select i.item_status from items where i.item_id = iu.item_id)
        where iu.effective_date = (select max(iu2.effective_date)
                                   from item_updates iu2
                                   where iu2.item_id = iu.item_id
                                  );
    
        2
  •  1
  •   Martin Preiss    7 年前

    也许 吧:

    update item_updates iup
       set iup.item_status = (select item_status ist
                                from ist.item_id = iup.item_id)
     where (iup.item_id, iup.last_change) = (select iup2.item_id, max(iup.last_change)
                                               from item_updates iup2
                                              where iup2.item_id = iup.item_id
                                              group by iup2.item_id)
    

    现在我看到了Gordon Linoff的答案,我知道我为什么要添加(已经关联的)项id。。。