我知道Oracle物化视图无法使用“not exists”子句快速刷新。 有工作吗?我尝试使用左外连接和(+),但这两个选项似乎也没有用。任何帮助表示赞赏
create materialized view mv_myview refresh fast as
select a.*
from tableA a
where
not exists (select * from tableB b where a.my_id = b.my_id);
答案 0 :(得分:3)
启用快速刷新很棘手,有许多奇怪的限制和无用的错误消息。在这种情况下,您需要创建一个物化视图日志WITH ROWID
,使用(+)
连接语法,并为每个表添加ROWID
。
create table tablea(my_id number primary key, a number);
create table tableb(my_id number primary key, b number);
create materialized view log on tablea with rowid;
create materialized view log on tableb with rowid;
create materialized view mv_myview refresh fast on commit as
select a.my_id, a.a, b.b, a.rowid a_rowid, b.rowid b_rowid
from tableA a, tableB b
where a.my_id = b.my_id(+)
and b.My_id IS NULL;
insert into tablea values(1, 1);
commit;
select * from mv_myview;
MY_ID A B A_ROWID B_ROWID
----- - - ------- -------
1 1 AAAUH3AAEAAC+t0AAA
答案 1 :(得分:2)
在oracle 11下执行查询,我遇到以下错误:
使用LEFT JOIN,我遇到了同样的问题:
create materialized view mv_myview refresh fast as
select a.*
from tableA a LEFT JOIN tableB b ON a.my_id = b.my_id
where
b.id IS NULL;
使用NOT IN ...同样的问题
create materialized view mv_myview refresh fast as
select a.*
from tableA a
where
a.my_id not in (select b.my_id from tableB b);
急救信息非常明确:
ORA-12015:无法从a创建快速刷新物化视图 复杂查询原因:既不是ROWID也不是主键约束 支持复杂的查询。操作:重新发出命令 REFRESH FORCE或REFRESH COMPLETE选项或创建一个简单的 物化观点。
这个问题似乎不可能。您必须更改视图类型。
答案 2 :(得分:2)
我想不出一个完整的解决方法。如果由于某些原因而导致的不存在的反连接效率低下,那么您可以基于优化来创建快速刷新MV:
select my_id, count(*)
from tab
group by my_id
反连接通常非常有效。你不只是错过了索引吗?