问题
I am using below query to build a materialized view.
CREATE MATERIALIZED VIEW gcms_business_profile_mview
BUILD IMMEDIATE
REFRESH FAST
WITH PRIMARY KEY
START WITH SYSDATE
NEXT (TRUNC (SYSDATE + 1) + 20 / 96)
AS
SELECT DISTINCT obp.bp_id,
obp.bp_typ_cd,
os.spcl_desc,
obpi.frs_nm,
obpi.mdl_nm,
NVL (rep_lst_nm.lst_nm, othr_lst_nm.lst_nm) last_name,
NVL (rep_lst_nm.lst_nm_typ_id, othr_lst_nm.lst_nm_typ_id)
last_name_type_id
FROM tr_ods.ods_business_parties obp
LEFT JOIN ( SELECT bp_id,
speciality_id,
updtd_dt,
ROW_NUMBER ()
OVER (PARTITION BY bp_id ORDER BY updtd_dt DESC)
AS spec_rn
FROM tr_ods.ods_bp_specialty
WHERE updtd_dt IS NOT NULL
) obs
ON obs.bp_id = obp.bp_id
AND obs.spec_rn =1
LEFT JOIN tr_ods.ods_specialty os
ON os.speciality_id = latest_spec.speciality_id
AND os.delete_flag = 'N'
LEFT JOIN tr_ods.ods_business_party_individuals obpi
ON obpi.bp_id = obp.bp_id
LEFT JOIN (SELECT obpln1.bp_id,
obpln1.lst_nm,
obpln1.lst_nm_typ_id,
ROW_NUMBER ()
OVER (PARTITION BY obpln1.bp_id ORDER BY updtd_dt DESC)
AS lst_rn_22
FROM tr_ods.ods_business_party_last_names obpln1
WHERE lst_nm_typ_id = 22
AND updtd_dt =
(SELECT MAX (obpln2.updtd_dt)
FROM tr_ods.ods_business_party_last_names obpln2
WHERE obpln2.bp_id = obpln1.bp_id
AND obpln2.lst_nm_typ_id = 22)) rep_lst_nm
ON (rep_lst_nm.bp_id = obp.bp_id AND rep_lst_nm.lst_rn_22 = 1)
LEFT JOIN (SELECT obpln1.bp_id,
obpln1.lst_nm,
obpln1.lst_nm_typ_id,
ROW_NUMBER ()
OVER (PARTITION BY obpln1.bp_id ORDER BY updtd_dt DESC)
AS lst_rn
FROM tr_ods.ods_business_party_last_names obpln1
WHERE lst_nm_typ_id IN (21, 23)
AND updtd_dt =
(SELECT MAX (obpln2.updtd_dt)
FROM tr_ods.ods_business_party_last_names obpln2
WHERE obpln2.bp_id = obpln1.bp_id
AND obpln2.lst_nm_typ_id IN (21, 23))) othr_lst_nm
ON (othr_lst_nm.bp_id = obp.bp_id AND othr_lst_nm.lst_rn = 1)
I am getting
ORA-12015: cannot create a fast refresh materialized view from a complex query error message.
I have already created materialized view logs for all the tables. Could any one please help me in fixing this issue?
回答1:
CREATE MATERIALIZED VIEW - Restrictions on FAST Refresh
Restrictions on FAST Refresh
FAST refresh is subject to the following restrictions:
When you specify FAST refresh at create time, Oracle Database verifies that the materialized view you are creating is eligible for fast refresh. When you change the refresh method to FAST in an ALTER MATERIALIZED VIEW statement, Oracle Database does not perform this verification. If the materialized view is not eligible for fast refresh, then Oracle Database returns an error when you attempt to refresh this view.
Materialized views are not eligible for fast refresh if the defining query contains an analytic function or the XMLTable function.
Materialized views are not eligible for fast refresh if the defining query references a table on which an XMLIndex index is defined.
You cannot fast refresh a materialized view if any of its columns is encrypted.
Your query contains an analytic finction:
ROW_NUMBER () OVER (PARTITION BY bp_id ORDER BY updtd_dt DESC)
therefore you cannot use a fast refresh for this query.
来源:https://stackoverflow.com/questions/46127783/ora-12015-cannot-create-a-fast-refresh-materialized-view-from-a-complex-query