0

我有一个名为 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。

这样做的好方法是什么?

4

1 回答 1

1

最懒惰的方法是从查询中选择 rowid,然后执行以下操作:

UPDATE hist SET ....
WHERE rowid IN (  your query )

我创建了SQLFiddle 演示来演示这一点。

查询可能如下所示:

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 表的名称用“”括起来以避免语法错误

于 2013-07-30T21:23:47.747 回答