如何在闪回查询结果集中排除未更改的字段?

问题描述

是否可以在闪回查询结果集中排除未更改的字段?

考虑到我有下表

create table first_table
(
    id int generated as identity,name NVARCHAR2(1024),age smallint,notebook nclob,userpic clob,salary float
)

如果表在版本查询后具有非常频繁的更新(例如,在notebook字段上更新)

select ROWID,VERSIONS_OPERATION,VERSIONS_STARTSCN,VERSIONS_STARTTIME,VERSIONS_XID,id,name,age,notebook,userpic,salary
from FirsT_TABLE versions between scn 1469193 and 1482882;

即使相同,也将为每行拉取沉重的userpic值。

我能以某种方式避免这种情况,而是为未更改的值获取NULL吗?

解决方法

您可以使用LAG()分析函数来比较当前行和上一行的列值。因此,选择任何与LAG值不匹配的列的值以仅显示更改,而将其他保留为NULL

SELECT versions_starttime,f.ID,f.name,f.age,CASE WHEN NVL(TO_CHAR(f.notebook),' ') != 
                 NVL(LAG(TO_CHAR(f.notebook)) OVER 
                     (PARTITION BY TO_CHAR(f.notebook) 
                          ORDER BY VERSIONS_STARTTIME NULLS FIRST),' ')
            THEN
                 f.notebook
             END AS notebook,CASE WHEN NVL(TO_CHAR(f.userpic),' ') != 
                 NVL(LAG(TO_CHAR(f.userpic)) OVER 
                     (PARTITION BY TO_CHAR(f.userpic) 
                          ORDER BY VERSIONS_STARTTIME NULLS FIRST),' ')
            THEN
                 f.userpic
             END AS userpic,f.salary                       
  FROM first_table 
  VERSIONS BETWEEN SCN 1469193 AND 1482882 f