由于那个 UNION ALL,Oracle 抛出 ORA-12054 异常。它不喜欢重复。删除 ALL 关键字,你就有了一个有效的 MView,但也是一个令人厌烦的 MView:你不妨完全删除第二个查询,因为无论如何你不会有重复的。
当然,MView 查询的虚假性质可能只是您简化测试用例以在 SO 上发布的方式的产物。如果是这样,如果您提出一个更现实的场景,这将有助于我们了解您的情况。
请注意,尽管删除 ALL 会为您提供有效的 MView,但您仍然无法创建它。您的 MView 日志仅指定 ROWID,这意味着您无法使用 REFRESH FAST 选项创建 MView。要么你去 REFRESH FULL 要么你需要在日志规范中包含主键:
SQL> create materialized view mv_test
refresh fast on commit as
select id, name, rowid rid
from daniel 2 3 4
5 /
from daniel
*
ERROR at line 4:
ORA-23415: materialized view log for "APC"."DANIEL" does not record the primary key
SQL> drop materialized view log on daniel ;
Materialized view dropped.
SQL> create materialized view log on daniel with rowid, primary key;
Materialized view log created.
SQL> create materialized view mv_test
refresh fast on commit as
select id, name, rowid rid
from daniel 2 3 4
5 /
Materialized view created.
SQL>