我想从2个表的左连接中创建一个实现的视图。但是以下情况给我一个错误:

    SELECT field1 
     FROM table_1 a 
     LEFT JOIN table_2 b 
     ON a.field1=b.field2

ORA-122054:无法为实体视图设置上的提交刷新属性

但是以下工作:

SELECT field1 
 FROM table_1 a, table_2 b 
 WHERE a.field1=b.field2

有人有任何想法为什么会发生这种情况。

THX寻求帮助

有帮助吗?

解决方案

有两种条件不满意,可以快速地使该实现的视图刷新。首先是您没有指定每个涉及的每个表的ROWID列。第二个是无证件的限制:不支持ANSI-JOINS。

这是一个示例,部门为table_1,别名A和EMP为table_2,别名B:

SQL> create materialized view log on emp with rowid
  2  /

Materialized view log created.

SQL> create materialized view log on dept with rowid
  2  /

Materialized view log created.

SQL> create materialized view empdept_mv
  2    refresh fast on commit
  3  as
  4  select a.deptno
  5    from dept a
  6         left join emp b on (a.deptno = b.deptno)
  7  /
  from dept a
       *
ERROR at line 5:
ORA-12054: cannot set the ON COMMIT refresh attribute for the materialized view

模仿您的情况。首先添加ROWID:

SQL> create materialized view empdept_mv
  2    refresh fast on commit
  3  as
  4  select a.rowid dept_rowid
  5       , b.rowid emp_rowid
  6       , a.deptno
  7    from dept a
  8         left join emp b on (a.deptno = b.deptno)
  9  /
  from dept a
       *
ERROR at line 7:
ORA-12054: cannot set the ON COMMIT refresh attribute for the materialized view

由于ANSI加入,它仍然无法快速刷新。转换为老式的外部加入语法:

SQL> create materialized view empdept_mv
  2    refresh fast on commit
  3  as
  4  select a.rowid dept_rowid
  5       , b.rowid emp_rowid
  6       , a.deptno
  7    from dept a
  8       , emp b
  9   where a.deptno = b.deptno (+)
 10  /

Materialized view created.

并证明它有效:

SQL> select * from empdept_mv
  2  /

DEPT_ROWID         EMP_ROWID              DEPTNO
------------------ ------------------ ----------
AAARhmAAEAAAAI/AAB AAARhlAAEAAAAI3AAA         20
AAARhmAAEAAAAI/AAC AAARhlAAEAAAAI3AAB         30
AAARhmAAEAAAAI/AAC AAARhlAAEAAAAI3AAC         30
AAARhmAAEAAAAI/AAB AAARhlAAEAAAAI3AAD         20
AAARhmAAEAAAAI/AAC AAARhlAAEAAAAI3AAE         30
AAARhmAAEAAAAI/AAC AAARhlAAEAAAAI3AAF         30
AAARhmAAEAAAAI/AAA AAARhlAAEAAAAI3AAG         10
AAARhmAAEAAAAI/AAB AAARhlAAEAAAAI3AAH         20
AAARhmAAEAAAAI/AAA AAARhlAAEAAAAI3AAI         10
AAARhmAAEAAAAI/AAC AAARhlAAEAAAAI3AAJ         30
AAARhmAAEAAAAI/AAB AAARhlAAEAAAAI3AAK         20
AAARhmAAEAAAAI/AAC AAARhlAAEAAAAI3AAL         30
AAARhmAAEAAAAI/AAB AAARhlAAEAAAAI3AAM         20
AAARhmAAEAAAAI/AAA AAARhlAAEAAAAI3AAN         10
AAARhmAAEAAAAI/AAD                            40

15 rows selected.

SQL> insert into dept values (50,'IT','UTRECHT')
  2  /

1 row created.

SQL> commit
  2  /

Commit complete.

SQL> select * from empdept_mv
  2  /

DEPT_ROWID         EMP_ROWID              DEPTNO
------------------ ------------------ ----------
AAARhmAAEAAAAI/AAB AAARhlAAEAAAAI3AAA         20
AAARhmAAEAAAAI/AAC AAARhlAAEAAAAI3AAB         30
AAARhmAAEAAAAI/AAC AAARhlAAEAAAAI3AAC         30
AAARhmAAEAAAAI/AAB AAARhlAAEAAAAI3AAD         20
AAARhmAAEAAAAI/AAC AAARhlAAEAAAAI3AAE         30
AAARhmAAEAAAAI/AAC AAARhlAAEAAAAI3AAF         30
AAARhmAAEAAAAI/AAA AAARhlAAEAAAAI3AAG         10
AAARhmAAEAAAAI/AAB AAARhlAAEAAAAI3AAH         20
AAARhmAAEAAAAI/AAA AAARhlAAEAAAAI3AAI         10
AAARhmAAEAAAAI/AAC AAARhlAAEAAAAI3AAJ         30
AAARhmAAEAAAAI/AAB AAARhlAAEAAAAI3AAK         20
AAARhmAAEAAAAI/AAC AAARhlAAEAAAAI3AAL         30
AAARhmAAEAAAAI/AAB AAARhlAAEAAAAI3AAM         20
AAARhmAAEAAAAI/AAA AAARhlAAEAAAAI3AAN         10
AAARhmAAEAAAAI/AAD                            40
AAARhmAAEAAAAI7AAA                            50

16 rows selected.

ANSI-JOIN语法限制在第6点中提到 这个博客文章.

问候,罗布。

其他提示

因为这是一个古老的帖子;没有提到完整的解决方案。

  1. 外部连接的表格应具有Oracle Doc中提到的主键。
  2. 查询不应具有任何其他约束,即不应有任何过滤条件 WHERE 条款,只是联合;也没有 CASE/DECODE 语句 SELECT 条款; GROUP BY, SUM(), COUNT() 不过,允许这样。

在上面的示例示例中,如果在Dept ID列的部门表上创建了主键,则查询将工作。

遵循以下说明进行DBMS_MVIEW.EXPLAIN_MVIEW工作:http://www.sqlsnippets.com/en/topic-12884.html

能够:

Refresh_complete

无法:

refresh_fast

REFRESH_FAST_AFTER_INSERT
内联视图或从列表中不支持此类型MV的列表

REFRESH_FAST_AFTER_INSERT
内联视图或从列表中不支持此类型MV的列表

REFRESH_FAST_AFTER_INSERT
查看或从列表中查看或子查询

REFRESH_FAST_AFTER_ONETAB_DML
查看refresh_fast_after_insert禁用的原因

MV_report

refresh_fast_after_any_dml
查看refresh_fast_after_onetab_dml禁用的原因

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top