Используйте 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;