甲骨文:实现的视图在使用左JOIN时不起作用
-
19-09-2019 - |
题
我想从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点中提到 这个博客文章.
问候,罗布。
其他提示
因为这是一个古老的帖子;没有提到完整的解决方案。
- 外部连接的表格应具有Oracle Doc中提到的主键。
- 查询不应具有任何其他约束,即不应有任何过滤条件
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禁用的原因