sourcetip

Oracle : LEFT JOIN 사용 시 구체화된 보기가 작동하지 않음

fileupload 2023. 7. 2. 20:56
반응형

Oracle : LEFT JOIN 사용 시 구체화된 보기가 작동하지 않음

두 테이블의 왼쪽 조인에서 구체화된 뷰를 만들고 싶습니다.그러나 다음과 같은 오류가 발생합니다.

    SELECT field1 
     FROM table_1 a 
     LEFT JOIN table_2 b 
     ON a.field1=b.field2

ORA-12054: 구체화된 보기에 대해 ON COMMIT 새로 고침 특성을 설정할 수 없습니다.

그러나 다음은 작동합니다.

SELECT field1 
 FROM table_1 a, table_2 b 
 WHERE a.field1=b.field2

왜 이런 일이 일어나는지 아는 사람?

도움을 요청합니다.

구체화된 보기를 빠르게 새로 고치기에는 두 가지 조건이 충족되지 않습니다.첫 번째는 관련된 모든 테이블의 행 ID 열을 지정하지 않았다는 것입니다.두 번째는 문서화되지 않은 제한입니다. ANSI 조인은 지원되지 않습니다.

다음은 DEPT가 table_1이고 별칭이 a이며 EMP가 table_2이고 별칭이 b인 예제입니다.

SQL> create materialized view log on emp with rowid
  2  /

Materialized view log created.

SQL> create materialized view log on dept with rowid
  2  /

Materialized view log created.

SQL> create materialized view empdept_mv
  2    refresh fast on commit
  3  as
  4  select a.deptno
  5    from dept a
  6         left join emp b on (a.deptno = b.deptno)
  7  /
  from dept a
       *
ERROR at line 5:
ORA-12054: cannot set the ON COMMIT refresh attribute for the materialized view

그것은 당신의 상황을 닮았습니다.먼저 행 ID를 추가합니다.

SQL> create materialized view empdept_mv
  2    refresh fast on commit
  3  as
  4  select a.rowid dept_rowid
  5       , b.rowid emp_rowid
  6       , a.deptno
  7    from dept a
  8         left join emp b on (a.deptno = b.deptno)
  9  /
  from dept a
       *
ERROR at line 7:
ORA-12054: cannot set the ON COMMIT refresh attribute for the materialized view

그러나 ANSI 가입으로 인해 빠른 새로 고침이 불가능합니다.이전 스타일의 외부 조인 구문으로 변환:

SQL> create materialized view empdept_mv
  2    refresh fast on commit
  3  as
  4  select a.rowid dept_rowid
  5       , b.rowid emp_rowid
  6       , a.deptno
  7    from dept a
  8       , emp b
  9   where a.deptno = b.deptno (+)
 10  /

Materialized view created.

그리고 그것이 효과가 있다는 것을 증명하기 위해:

SQL> select * from empdept_mv
  2  /

DEPT_ROWID         EMP_ROWID              DEPTNO
------------------ ------------------ ----------
AAARhmAAEAAAAI/AAB AAARhlAAEAAAAI3AAA         20
AAARhmAAEAAAAI/AAC AAARhlAAEAAAAI3AAB         30
AAARhmAAEAAAAI/AAC AAARhlAAEAAAAI3AAC         30
AAARhmAAEAAAAI/AAB AAARhlAAEAAAAI3AAD         20
AAARhmAAEAAAAI/AAC AAARhlAAEAAAAI3AAE         30
AAARhmAAEAAAAI/AAC AAARhlAAEAAAAI3AAF         30
AAARhmAAEAAAAI/AAA AAARhlAAEAAAAI3AAG         10
AAARhmAAEAAAAI/AAB AAARhlAAEAAAAI3AAH         20
AAARhmAAEAAAAI/AAA AAARhlAAEAAAAI3AAI         10
AAARhmAAEAAAAI/AAC AAARhlAAEAAAAI3AAJ         30
AAARhmAAEAAAAI/AAB AAARhlAAEAAAAI3AAK         20
AAARhmAAEAAAAI/AAC AAARhlAAEAAAAI3AAL         30
AAARhmAAEAAAAI/AAB AAARhlAAEAAAAI3AAM         20
AAARhmAAEAAAAI/AAA AAARhlAAEAAAAI3AAN         10
AAARhmAAEAAAAI/AAD                            40

15 rows selected.

SQL> insert into dept values (50,'IT','UTRECHT')
  2  /

1 row created.

SQL> commit
  2  /

Commit complete.

SQL> select * from empdept_mv
  2  /

DEPT_ROWID         EMP_ROWID              DEPTNO
------------------ ------------------ ----------
AAARhmAAEAAAAI/AAB AAARhlAAEAAAAI3AAA         20
AAARhmAAEAAAAI/AAC AAARhlAAEAAAAI3AAB         30
AAARhmAAEAAAAI/AAC AAARhlAAEAAAAI3AAC         30
AAARhmAAEAAAAI/AAB AAARhlAAEAAAAI3AAD         20
AAARhmAAEAAAAI/AAC AAARhlAAEAAAAI3AAE         30
AAARhmAAEAAAAI/AAC AAARhlAAEAAAAI3AAF         30
AAARhmAAEAAAAI/AAA AAARhlAAEAAAAI3AAG         10
AAARhmAAEAAAAI/AAB AAARhlAAEAAAAI3AAH         20
AAARhmAAEAAAAI/AAA AAARhlAAEAAAAI3AAI         10
AAARhmAAEAAAAI/AAC AAARhlAAEAAAAI3AAJ         30
AAARhmAAEAAAAI/AAB AAARhlAAEAAAAI3AAK         20
AAARhmAAEAAAAI/AAC AAARhlAAEAAAAI3AAL         30
AAARhmAAEAAAAI/AAB AAARhlAAEAAAAI3AAM         20
AAARhmAAEAAAAI/AAA AAARhlAAEAAAAI3AAN         10
AAARhmAAEAAAAI/AAD                            40
AAARhmAAEAAAAI7AAA                            50

16 rows selected.

ANSI-join 구문 제한은 이 블로그 게시물의 포인트 6에 언급되어 있습니다.

안녕, 롭.

이것은 오래된 게시물이기 때문에 완전한 해결책을 언급하지 않았습니다.

  1. 외부 결합된 테이블에는 Oracle 문서에 언급된 기본 키가 있어야 합니다.
  2. 쿼리에 다른 제약 조건이 있으면 안 됩니다. 즉, 다음에 필터 기준이 있으면 안 됩니다.WHERE절, 조인만; 또한 가질 수 없습니다.CASE/DECODE의 진술.SELECT조항;GROUP BY,SUM(),COUNT()하지만, 그런 것들은 허용됩니다.

위의 예제에서는 기본 키가 부서 테이블의 dept id 열에 생성된 경우 쿼리가 작동합니다.

다음 지침에 따라 DBMS_MVIEW.EXPLINE_MVIEW가 작동하도록 합니다. http://www.sqlsnippets.com/en/topic-12884.html

기능:

새로 고침_완료

다음을 수행할 수 없음:

새로 고침_FAST

새로 고침_FAST_After_Insert
이 유형 MV에서는 FROM 목록의 인라인 뷰 또는 하위 쿼리가 지원되지 않습니다.

새로 고침_FAST_After_Insert
이 유형 MV에서는 FROM 목록의 인라인 뷰 또는 하위 쿼리가 지원되지 않습니다.

새로 고침_FAST_After_Insert
목록에서 보기 또는 하위 쿼리

REFRESH_FAST_AFAST_ONETAB_DML
REFRESH_FAST_After_INSERT가 비활성화된 이유 확인

MV_REPORT

REFRESH_FAST_After_ANY_DML
REFRESH_FAST_After_ONETAB_DML이 비활성화된 이유 확인

언급URL : https://stackoverflow.com/questions/1312980/oracle-materialized-view-not-working-when-using-left-join

반응형