[英]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.