如何使用 union(或 union all)和连接创建物化视图

How to create a materialized view with union(or union all) and joins

出于性能需要,我想使用以下脚本在提交刷新选项上创建物化视图:

CREATE TABLE DEVDV 
(DEVDV_ID INTEGER PRIMARY kEY, 
DEVDV_SRC_DVISE_ID INTEGER, 
DEVDV_CIB_DVISE_ID INTEGER);


CREATE TABLE CONDV 
(CONDV_ID INtEgEr PRiMARY KEY, 
CONDV_DEVDV_iD INTEGER, 
CONDV_TX NUMbeR, 
CONDV_DATE_DEB datE, 
CONDV_DATE_FIN DATE);

CREATE MATERIALIZED VIEW LOG ON DEVDV WITH ROWID;

CREATE MATERIALIZED VIEW LOG ON CONDV WITH ROWID;

CREATE MATERIALIZED VIEW MV_DEVDV_TYP_2
REFRESH FAST
ON COMMIT
AS
SELECT DEVDV.ROWID CROWID,
       CONDV.ROWID DROWID,
       DEVDV_ID,
       1 AS MARKER,
       DEVDV_SRC_DVISE_ID,
       DEVDV_CIB_DVISE_ID,
       CONDV_TX, 
       CONDV_DATE_DEB,
       CONDV_DATE_FIN
FROM
    DEVDV INNER JOIN CONDV ON DEVDV_ID = CONDV_DEVDV_ID
UNION ALL
SELECT DEVDV.ROWID CROWID,
       CONDV.ROWID DROW_ID,
       DEVDV_ID,
       2 AS MARKER,
       DEVDV_CIB_DVISE_ID,
       DEVDV_SRC_DVISE_ID,
       1/CONDV_TX, 
       CONDV_DATE_DEB,
       CONDV_DATE_FIN
FROM
    DEVDV INNER JOIN CONDV ON DEVDV_ID = CONDV_DEVDV_ID;

Oracle说这是一个复杂的查询,不满足快速刷新要求,

你能告诉我我违反了哪条规则吗?

我不知道为什么,但是 - 对于 oracle 中的物化视图 - 你必须使用旧语法进行连接。所以把所有的表都放在FROM中,用逗号分隔,连接条件放在where子句中(外连接使用“(+)”)。

对我有用:

CREATE MATERIALIZED VIEW MV_DEVDV_TYP_2
REFRESH FAST
ON COMMIT
AS
SELECT DEVDV.ROWID CROWID,
       CONDV.ROWID DROWID,
       DEVDV_ID,
       1 AS MARKER,
       DEVDV_SRC_DVISE_ID,
       DEVDV_CIB_DVISE_ID,
       CONDV_TX, 
       CONDV_DATE_DEB,
       CONDV_DATE_FIN
FROM
    DEVDV, CONDV
WHERE DEVDV_ID = CONDV_DEVDV_ID
UNION ALL
SELECT DEVDV.ROWID CROWID,
       CONDV.ROWID DROW_ID,
       DEVDV_ID,
       2 AS MARKER,
       DEVDV_CIB_DVISE_ID,
       DEVDV_SRC_DVISE_ID,
       1/CONDV_TX, 
       CONDV_DATE_DEB,
       CONDV_DATE_FIN
FROM
    DEVDV, CONDV 
WHERE DEVDV_ID = CONDV_DEVDV_ID;

Materialized view MV_DEVDV_TYP_2 created.