These are some common issues you can get while creating an MQT (Materialized Query Table) in DB2, especially when using a ‘REFRESH IMMEDIATE’ type of MQT.
Error: The fullselect specified for the materialized query table “PW999.PW999″ is not valid. Reason code = “6″.. SQLCODE=-20058, SQLSTATE=428EC
CREATE TABLE PW999.PW999 ( N_ID, D_DATUM, T_AAN, T_VAN, N_D1_IDF) AS (
SELECT DISTINCT A.N_I_ID AS N_ID,
...
Cause: The query that causes this error has a distinct statement, these are not allowed in an MQT. Your query must be designed in such way that each returned row is unique.
Error: The fullselect specified for the materialized query table “PW999.PW999″ is not valid. Reason code = “7″.. SQLCODE=-20058, SQLSTATE=428EC,
CREATE TABLE PW999.PW999 ( IDF, DIRECTIE_IDF, AANVRAAG, REFERTE ) AS (
SELECT A.IDF AS IDF,
A.DIRECTIE_IDF AS DIRECTIE_IDF,
TO_DATE(NULLIF(TRIM(D1.VALUE), ''), 'dd/mm/yyyy') AS AANVRAAG,
D2.VALUE AS REFERTE
FROM REQUEST A,
REQUEST_DATA D1,
REQUEST_DATA D2
WHERE A.REQUEST_TYPE = 215
AND (A.N_I_IDF = D1.REQUEST_IDF AND D1.REQUEST_FIELD_IDF = 36)
AND (A.N_I_IDF = D2.REQUEST_IDF AND D2.REQUEST_FIELD_IDF = 41)
) DATA INITIALLY DEFERRED REFRESH IMMEDIATE MAINTAINED BY SYSTEM
Cause: if you have an IMMEDIATE REFRESH MQT then you must select the primary keys of all referenced tables. In the previous query I did not select the primary keys for D1 and D2. Without these primary keys DB2 can’t do its incremental updates.
Error: The fullselect specified for the materialized query table “PW999.PW999″ is not valid. Reason code = “10″.. SQLCODE=-20058, SQLSTATE=428EC
CREATE TABLE PW999.PW999 ( IDF, DIRECTIE_IDF, AANVRAAG, REFERTE ) AS (
SELECT A.IDF AS IDF,
A.DIRECTIE_IDF AS DIRECTIE_IDF,
TO_DATE(NULLIF(TRIM(D1.VALUE), ''), 'dd/mm/yyyy') AS AANVRAAG,
D2.VALUE AS REFERTE
FROM REQUEST A
LEFT JOIN REQUEST_DATA D1 ON
(A.N_I_IDF = D1.REQUEST_IDF AND D1.REQUEST_FIELD_IDF = 36)
LEFT JOIN REQUEST_DATA D2 ON
(A.N_I_IDF = D2.REQUEST_IDF AND D2.REQUEST_FIELD_IDF = 41)
WHERE A.REQUEST_TYPE = 215
) DATA INITIALLY DEFERRED REFRESH IMMEDIATE MAINTAINED BY SYSTEM
Cause: the explicit JOIN statement is not allowed, just must join using where clauses.
The correct way of creating the MQT:
CREATE TABLE PW999.PW999 (IDF, DIRECTIE_IDF, AANVRAAG, REFERTE, D1_IDF, D2_IDF) AS (
SELECT A.IDF AS IDF,
A.DIRECTIE_IDF AS DIRECTIE_IDF,
TO_DATE(NULLIF(TRIM(D1.VALUE), ''), 'dd/mm/yyyy') AS AANVRAAG,
D2.VALUE AS REFERTE,
D1.IDF AS D1_IDF,
D2.IDF AS D2_IDF
FROM REQUEST A,
REQUEST_DATA D1,
REQUEST_DATA D2
WHERE A.REQUEST_TYPE = 215
AND (A.N_I_IDF = D1.REQUEST_IDF AND D1.REQUEST_FIELD_IDF = 36)
AND (A.N_I_IDF = D2.REQUEST_IDF AND D2.REQUEST_FIELD_IDF = 41)
) DATA INITIALLY DEFERRED REFRESH IMMEDIATE MAINTAINED BY SYSTEM
And it’s correct because:
- No JOIN statement
- No DISTINCT statement
- All primary keys are selected
- All returned rows are unique