1

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

考虑我有下表

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 吗?

4

1 回答 1

1

您可以使用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
于 2020-10-04T06:51:30.723 回答