Sql 如何排除Flashback查询结果集中未更改的字段?
是否可以在Flashback查询结果集中排除未更改的字段 假设我有下表Sql 如何排除Flashback查询结果集中未更改的字段?,sql,oracle,oracle12c,flashback,Sql,Oracle,Oracle12c,Flashback,是否可以在Flashback查询结果集中排除未更改的字段 假设我有下表 create table first_table ( id int generated as identity, name NVARCHAR2(1024), age smallint, notebook nclob, userpic clob, salary float ) 在版本化查询之后,如果表有非常频繁的更新(例如在笔记本字段上) select ROWID, VERSI
create table first_table
(
id int generated as identity,
name NVARCHAR2(1024),
age smallint,
notebook nclob,
userpic clob,
salary float
)
在版本化查询之后,如果表有非常频繁的更新(例如在笔记本
字段上)
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值,即使它是相同的
我是否可以避免这种情况,而不是为未更改的值获取空值?您可以使用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
谢谢你,巴巴拉斯!我将介绍这种方法。我想知道,在更改吞吐量非常高的情况下,对表的每一列进行这样的检查会对性能产生什么影响。下载“无用”字段并在客户端丢弃它们可能会变得更快。欢迎@expert,告诉我当前案例在性能方面的差异。