Sql Oracle-使用内部联接和分区进行更新?
我有一个名为HIST的表,如下所示:Sql Oracle-使用内部联接和分区进行更新?,sql,join,oracle11g,sql-update,Sql,Join,Oracle11g,Sql Update,我有一个名为HIST的表,如下所示: +---------------+---------------+----------------+-------------+-------------+ | ID | MGROUP | ACTIVESTATUS | FROM_DATE | TO_DATE | +---------------+---------------+----------------+-------------+---------
+---------------+---------------+----------------+-------------+-------------+
| 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) |
+---------------+---------------+----------------+-------------+-------------+
此表用于记录组的历史记录。例如,我们可以看到,管理组30546在2009年3月9日至9月5日处于非活动状态,然后在2009年9月5日至9月29日再次处于活动状态。然后在2009年9月29日再次停用,目前一直如此,直到将来的任何更新为空
现在我有了另一个表,它看起来像下面的组:
+-------------------+-------------+--------------+
| M_NAME | ID | ACTIVESTATUS |
+-------------------+-------------+--------------+
| Jack Smith | 30546 | Inactive |
| John Doe | 85764511006 | Active |
| Bobby Drop Tables | 85851006389 | Active |
+-------------------+-------------+--------------+
我已经写了一个Select语句,它完成了我想做的事情:
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"
我试图将其转换为update语句的任何尝试都失败了。我试图做的是,如果table GROUP.ACTIVESTATUS=Inactive,则将表HIST.to\u DATE设置为SYSDATE
这样做的好方法是什么 最懒的方法是从查询中选择rowid,并执行如下操作:
UPDATE hist SET ....
WHERE rowid IN ( your query )
我创建了一个示例来演示这一点
查询可能如下所示:
UPDATE hist
set to_date = sysdate
where rowid in (
select hist_rowid
from (
select rowid hist_rowid,
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
join "GROUP" ON hist.MGROUP = "GROUP".id AND "GROUP".ACTIVESTATUS = 'Inactive'
);
GROUP是Oracle中的保留字,所以我将GROUP表的名称括起来以避免语法错误Simple:UPDATE hist SET to_date=sysdate WHERE EXIST从组中选择1,其中hist.mgroup=GROUP.id和GROUP.activestatus='Inactive'不起作用?或者,可能:在hist.mgroup=group.id和group.activestatus='Inactive'上更新SELECT*FROM hist JOIN group设置为_date=sysdate@kordirko抱歉,如果我没有在评论中提到它,我需要获取每个mgroup的最新日期,null是最高值。这就是为什么我在分区上按mgroup order by to_date desc执行以下操作:row_number为hist中的第一个rowNumber,其中rowNumber=1Thanks!明天我会看一看,然后公布结果。Group不是表名,我只是在示例中命名了它,没有考虑。