簡體   English   中英

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

[英]PL/SQL - Update Rows with Max Date Using Value from another table

我有一個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的方式,並且我試圖將ITEM_STATUS列移至ITEM_UPDATES表。 過去發生的事情無關緊要,並且可能具有唯一的狀態,但是我想為每個記錄設置ITEM_STATUS,並將給定ID的MAX(LAST_CHANGE)設置為當前ITEMS中ITEM_STATUS列的值。 因此,基本上,完成的表將如下所示。

ITEM_UPDATES

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

我可以通過查詢來選擇下面的適當數據,但是由於必須比較item_ids以及該項目的最長日期記錄,因此我不知道如何將其轉換為更新語句。 這可行嗎?

  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

因此,您希望狀態在最新的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
                              );

也許:

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)的回答,我在問自己為什么要添加(已經相關的)item_id。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM