Ответ 1
Вы можете быстро обновить материализованное представление 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 для соединения необходимо создать материализованные журналы просмотра базовой таблицы WITH ROWID.
Возможно, вам захочется взглянуть на серию сообщений в блогах, которые я написал о быстро обновляемых материализованных ошибках. Они описывают почти все ограничения:
Основные MV
Присоединиться к MV
Агрегат MV
Объединить все MV
Вложенные MV
MV_CAPABILITIES_TABLE
Резюме
С уважением,
Роб.
Добавлено: 29-09-2011
Вот пример с вложенным MV с помощью объединения всех трюков на test2:
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.
Надеюсь, это поможет!