问题描述
是否可以在闪回查询结果集中排除未更改的字段?
考虑到我有下表
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