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

时间:2014-01-28 07:32:05

标签: sql oracle materialized-views

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

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,但第二部分则无法添加,因为它有连接。

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

  1. NAME上为T2添加冗余列,并从查询中删除T3
  2. 添加一个虚拟列,其中包含一个从T3中选择名称的函数

    名称NVARCHAR2(4000)始终为(“SCHEMA”。“GET_NAME_FROM_OTHER_TABLE”(“ID”))

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

      

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

      

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

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

1 个答案:

答案 0 :(得分: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才能在第一次查询中获得正确的数据类型。