您可以像这样使 test4 物化视图快速刷新:
SQL> create table test1
2 ( x1 varchar2(1000)
3 , constraint test1_pk primary key (x1)
4 )
5 /
Table created.
SQL> create materialized view log on test1 with rowid
2 /
Materialized view log created.
SQL> create table test2
2 ( x2 varchar2(1000)
3 , constraint test2_pk primary key (x2)
4 )
5 /
Table created.
SQL> create materialized view log on test2 with rowid
2 /
Materialized view log created.
SQL> create materialized view test4
2 refresh fast on commit
3 as
4 select t1.rowid as rid1
5 , t2.rowid as rid2
6 , t1.x1 u1
7 , t2.x2
8 from test1 t1
9 , test2 t2
10 where t1.x1 = t2.x2
11 /
Materialized view created.
SQL> insert into test1 values ('hello')
2 /
1 row created.
SQL> insert into test2 values ('hello')
2 /
1 row created.
SQL> commit
2 /
Commit complete.
SQL> select * from test4
2 /
RID1 RID2
------------------ ------------------
U1
---------------------------------------------
X2
---------------------------------------------
AAATU5AAEAAAssfAAA AAATU8AAEAAAssvAAA
hello
hello
1 row selected.
您的情况不起作用,因为要使嵌套 MV 起作用,基础 MV 不能是基本 MV。起初这听起来很奇怪,但您需要像使用 test3 一样的技巧才能使其工作。此外,要使连接 MV 起作用,需要使用 ROWID 创建基础表的物化视图日志。
您可能想查看我写的关于快速可刷新物化视图错误的一系列博客文章。它们描述了几乎所有的限制:
Basic MV's
Join MV's
Aggregate MV's
Union all MV's
Nested MV's
MV_CAPABILITIES_TABLE
Summary
问候,
罗布。
添加:2011 年 9 月 29 日
这是一个嵌套 MV 的示例,它也在 test2 上使用了 union all 技巧:
SQL> create table test1
2 ( x1 varchar2(1000)
3 , constraint test1_pk primary key (x1)
4 )
5 /
Table created.
SQL> create materialized view log on test1 with rowid
2 /
Materialized view log created.
SQL> create table test2
2 ( x2 varchar2(1000)
3 , constraint test2_pk primary key (x2)
4 )
5 /
Table created.
SQL> create materialized view log on test2 with rowid
2 /
Materialized view log created.
SQL> create materialized view test2_mv
2 refresh fast on commit
3 as
4 select rowid rid
5 , x2
6 , 'A' umarker
7 from test2
8 union all
9 select rowid
10 , x2
11 , 'B'
12 from test2
13 where 1=0
14 /
Materialized view created.
SQL> alter table test2_mv add constraint test2_mv_pk primary key(x2)
2 /
Table altered.
SQL> create materialized view log on test2_mv with rowid
2 /
Materialized view log created.
SQL> create materialized view test3
2 refresh fast on commit
3 as
4 select rowid rid
5 , x1
6 , 'A' umarker
7 from test1
8 union all
9 select rowid
10 , x1
11 , 'B'
12 from test1
13 where 0 = 1
14 /
Materialized view created.
SQL> alter table test3 add constraint test3_pk primary key (x1)
2 /
Table altered.
SQL> create materialized view log on test3 with rowid
2 /
Materialized view log created.
SQL> create materialized view test4
2 refresh fast on commit
3 as
4 select t1.rowid as rid1
5 , t2.rowid as rid2
6 , t1.x1 u1
7 , t2.x2
8 from test3 t1
9 , test2_mv t2
10 where t1.x1 = t2.x2
11 /
Materialized view created.
SQL> insert into test1 values ('hello')
2 /
1 row created.
SQL> insert into test2 values ('hello')
2 /
1 row created.
SQL> commit
2 /
Commit complete.
SQL> select * from test4
2 /
RID1 RID2
------------------ ------------------
U1
---------------------------------------------------
X2
---------------------------------------------------
AAATXbAAEAAAstdAAA AAATXXAAEAAAstNAAA
hello
hello
1 row selected.
希望这可以帮助!