Sql 如何排除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

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

假设我有下表

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,告诉我当前案例在性能方面的差异。