首页 文章

在具有虚拟列的物化视图上快速刷新

提问于
浏览
2

我想要一个快速刷新的物化视图(更新所包含的表更新) . 物化视图查询类似于:

SELECT T1.CODE, T2.NAME
FROM T1

UNION ALL

SELECT T2.CODE, T3.NAME
FROM T2, T3
WHERE T2.ID = T3.ID

看来,在使用 UNION ALL 的情况下,我应该添加 ROWID 以实现快速刷新 .

添加 ROWID 对于第一部分是可以的,但是对于第二部分,它不能被添加,因为它具有连接 .

似乎有两种方法可以解决这个问题:

  • T2 上为 NAME 添加冗余列,并从查询中删除 T3 .

  • 添加一个包含从 T3 中选择名称的函数的虚拟列

名称NVARCHAR2(4000)始终生成(“SCHEMA” . “GET_NAME_FROM_OTHER_TABLE”(“ID”))

根据这个链接:http://www.oracle-base.com/articles/11g/virtual-columns-11gr1.php它说:

必须完全刷新访问虚拟列的物化视图 .

如果它引用了确定性的用户定义函数,则不能将其用作分区键列 .

我仍然可以使用解决方案2在物化视图上使用快速刷新选项吗?

1 回答

  • 0

    这有用吗?

    SELECT T1.CODE, T2.NAME, T1.ROWID as ROWID_T1, NULL as ROWID_T2, NULL as ROWID_T3 
    FROM T1
    
    UNION ALL
    
    SELECT T2.CODE, T3.NAME, NULL as ROWID_T1, T2.ROWID as ROWID_T2, T3.ROWID as ROWID_T3 
    FROM T2, T3
    WHERE T2.ID = T3.ID
    

    也许你必须使用 CAST(NULL AS ROWID) AS ROWID_T2 才能在第一次查询中获得正确的数据类型 .

相关问题