Oracle从审计表获取字段变更新旧值的SQL查询方法
解决方案:用Oracle窗口函数
LAG()实现变更前后值对比 这个需求很典型,用Oracle自带的窗口函数LAG()就能轻松搞定!
核心思路
你的审计表记录了每一次值变更的历史,我们只需要为每条记录找到它的上一条记录的VALUE(也就是变更前的旧值),当前记录的VALUE自然就是变更后的新值,而当前记录的CHANGED_DATE就是这次变更发生的时间。最后过滤掉没有旧值的第一条初始记录即可。
实现SQL
SELECT LAG(VALUE) OVER (ORDER BY CHANGED_DATE) AS OLD_VALUE, VALUE AS NEW_VALUE, CHANGED_DATE FROM 你的审计表名 WHERE LAG(VALUE) OVER (ORDER BY CHANGED_DATE) IS NOT NULL;
代码细节说明
LAG(VALUE) OVER (ORDER BY CHANGED_DATE):这个函数会按照CHANGED_DATE的时间顺序,为每条记录获取它前一条记录的VALUE值,作为OLD_VALUE。这里用时间排序比用OID更稳妥,能避免OID和实际变更时间顺序不一致的情况;如果你的OID是严格按变更时间递增生成的,换成ORDER BY OID也完全可行。WHERE子句:过滤掉OLD_VALUE为空的记录——也就是最开始的那条初始值记录,它没有之前的变更,所以不需要出现在结果里。
验证示例数据
把你提供的示例数据代入这个SQL,会直接输出你期望的结果:
OLD_VALUE|NEW_VALUE|CHANGED_DATE -------------------------------- ABC |DEF |22-JUN-18 DEF |XYZ |16-JUL-18
内容的提问来源于stack exchange,提问作者cloudwalker
相关产品推荐
相关产品推荐

