Oracle 更新语句无法正常工作

Posted

技术标签:

【中文标题】Oracle 更新语句无法正常工作【英文标题】:Oracle Update statement not working correctly 【发布时间】:2020-06-26 11:37:28 【问题描述】:

我想考虑每个字段值 OIDEXID 的组合,取最小值 LATEST_MODIFICATION_DATE 并在 FIRST_INSERTION_DATE 中更新相同的值。

我有很多冗余行,字段值 OIDEXID 的组合。但是为所有这些值设置最小 LATEST_MODIFICATION_DATE 日期应该没有问题。

我尝试了以下查询,但它无法正常工作:

update O_TEST t
set FIRST_INSERTION_DATE = (select min (LATEST_MODIFICATION_DATE) from O_TEST)
where rowid < (
  select max(rowid)
  from OBS_ORDER_ID_MAPPING_TEST t2
  where t.EXID = t2.EXID
    and t.OID = t2.OID
  );

【问题讨论】:

【参考方案1】:

您需要set 的相关子查询:

update O_TEST t
    set FIRST_INSERTION_DATE = (select min(t2.LATEST_MODIFICATION_DATE)
                                from O_TEST t2
                                where t2.EXID = t.EXID and t2.OID = t.OID
                               )
    where LATEST_MODIFICATION_DATE <> (select min(t2.LATEST_MODIFICATION_DATE)
                                       from O_TEST t2
                                       where (t2.EXID = t.EXID or t2.EXID is null and t.EXID is null) and
                                             t2.OID = t.OID
                                      );

要处理 NULL 值,您需要在相关子查询中考虑这些值:

update O_TEST t
    set FIRST_INSERTION_DATE = (select min(t2.LATEST_MODIFICATION_DATE)
                                from O_TEST t2
                                where t2.EXID = t.EXID and

t2.OID = t.OID ) 其中 LATEST_MODIFICATION_DATE (选择分钟(t2.LATEST_MODIFICATION_DATE) 从 O_TEST t2 其中(t2.EXID = t.EXID 或 t2.EXID 为空且 t.EXID 为空)和 t2.OID = t.OID );

根据您的评论,OID 不是 NULL,但如果是这样,您也可以使用类似的逻辑。

【讨论】:

它工作正常,但我也有 EXID,它对于 OID 为空,在这种情况下,日期尚未更新 我们如何考虑这些值的组合?

以上是关于Oracle 更新语句无法正常工作的主要内容,如果未能解决你的问题,请参考以下文章

Oracle 使用MERGE INTO 语句更新数据

Oracle 使用MERGE INTO 语句更新数据

NHibernate Oracle - 事务提交问题

oracle存储过程中update语句一直在执行中,无法更新完成

除插入语句外,存储过程工作正常

无法用左连接编写更新语句