我有一个名为 HIST 的表,如下所示:
+---------------+---------------+----------------+-------------+-------------+
| ID | MGROUP | ACTIVESTATUS | FROM_DATE | TO_DATE |
+---------------+---------------+----------------+-------------+-------------+
| 86183752530 | 30546 | Inactive | 09-MAR-09 | 05-SEP-09 |
| 86183752533 | 30546 | Active | 05-SEP-09 | 29-SEP-09 |
| 86183752534 | 30546 | Inactive | 29-SEP-09 | (null) |
| 86369271439 | 85764511006 | Active | 19-OCT-10 | (null) |
| 86369271447 | 85851006389 | Active | 16-NOV-10 | (null) |
| 86369271517 | 86369271513 | Active | 25-JAN-11 | (null) |
+---------------+---------------+----------------+-------------+-------------+
该表用于记录组的历史。例如,我们可以看到 MGROUP 30546 在 2009 年 3 月 9 日至 09 年 9 月 5 日处于非活动状态,然后在 09 年 9 月 9 日至 29 日再次处于活动状态。然后终于在 29-SEP-09 再次进入非活动状态,目前一直处于这种状态,直到任何未来的更新( null )。
现在我有另一个名为 GROUP 的表,如下所示:
+-------------------+-------------+--------------+
| M_NAME | ID | ACTIVESTATUS |
+-------------------+-------------+--------------+
| Jack Smith | 30546 | Inactive |
| John Doe | 85764511006 | Active |
| Bobby Drop Tables | 85851006389 | Active |
+-------------------+-------------+--------------+
我写了一个选择语句来做我想做的事情:
select
m_name,
hist.to_date,
SYSDATE AS new_hist_to_date
from group
inner join
(
select
mgroup,
from_date,
to_date,
rowNumber
from
(
select
mgroup,
from_date,
to_date, activestatus, row_number() over ( partition by mgroup order by to_date desc nulls first) rowNumber
from hist
)
where rowNumber = 1
) hist ON hist.MGROUP = group.id
where m_mgroup.ACTIVESTATUS = "Inactive"
我将其转换为更新语句的任何尝试都失败了。如果表 GROUP.ACTIVESTATUS = Inactive,我想要做的是将表 HIST.TO_DATE 设置为 SYSDATE。
这样做的好方法是什么?