Материализованное представление - FAST refre sh невозможно создать из-за сложного запроса - PullRequest
1 голос
/ 04 мая 2020

Мы работаем над материализованным представлением, которое успешно создается при обновлении sh FORCE или COMPLETE, но не создает MV при обновлении sh FAST. Ошибка: «Либо ROWID некоторых таблиц отсутствовали в определении, либо внутренняя таблица внешнего соединения не имела ограничений UNIQUE для столбцов соединения». ИЛИ «Ни ROWID, ни ограничения первичного ключа не поддерживаются для сложных запросов.»

Ниже запрос -

-- MATERIALIZED VIEW log for A

CREATE MATERIALIZED VIEW LOG ON SCHEMA.A
TABLESPACE A_SCHEMA_DATA
WITH PRIMARY KEY
INCLUDING NEW VALUES;

-- MATERIALIZED VIEW log for B
CREATE MATERIALIZED VIEW LOG ON A_SCHEMA.B
TABLESPACE A_SCHEMA_DATA 
WITH PRIMARY KEY
INCLUDING NEW VALUES;


-- MATERIALIZED VIEW Query
CREATE MATERIALIZED VIEW A_SCHEMA.MV_A1
BUILD IMMEDIATE 
REFRESH FAST ON DEMAND
AS 

  SELECT * FROM (
   SELECT 
        A.T_ID,
        B.NAME AS NAME,
        B.ANS AS ANS
   FROM A_SCHEMA.A A, A_SCHEMA.B B
   WHERE A.T_ID = B.T_ID AND 
   B.NAME IN ('Order', 'Price')
 )
 PIVOT
 (
   MAX(to_char(SUBSTR(ANS, 0,100)))
   FOR NAME IN ('Order' ORDER, 'Price' PRICE)
 )
ORDER BY A.CREATED_DATE BY DESC;

1 Ответ

0 голосов
/ 08 мая 2020

Используйте MAX(DECODE... вместо PIVOT, чтобы обойти ошибку «ORA-12015: невозможно создать быстрое refre sh материализованное представление из сложного запроса».

Fast refre sh материализовано представления часто требуют использования более старых версий функций, и запросы часто оказываются некрасивыми. Например, мы должны использовать старомодный синтаксис соединения (+) вместо соединений ANSI. PIVOT не годится, и даже шаблон MAX(CASE WHEN... не работает в 11g. Вам также необходимо добавить некоторые настройки в журналы материализованного представления, как описано ниже.

Пример схемы

--drop table a;
--drop table b;
--drop materialized view mv_a1;

create table a(t_id number primary key);
create materialized view log on a with sequence,rowid(t_id) including new values;

create table b(t_id number, name varchar2(100), ans varchar2(100));
create materialized view log on b with sequence,rowid(t_id,name,ans) including new values;

insert into a values(1);
insert into a values(2);
insert into b values(1, 'Order', 'A');
insert into b values(2, 'Price', 'A');
insert into b values(2, 'Price', 'B');

Материализованное представление

create materialized view mv_a1
build immediate 
refresh fast on commit
AS 
select
    a.t_id,
    max(decode(name, 'Order', to_char(substr(ans, 0,100)))) the_order,
    max(decode(name, 'Price', to_char(substr(ans, 0,100)))) price
    --In old versions (11g and below?), extra COUNTs were necessary.
    --See: https://docs.oracle.com/cd/E11882_01/server.112/e25554/basicmv.htm#DWHSG0082
    ,count(*) the_count, count(a.t_id) count_t_id, count(name) count_name, count(ans) count_ans
from a, b
where a.t_id = b.t_id
group by a.t_id;
...