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에 언급되어 있습니다.
안녕, 롭.
이것은 오래된 게시물이기 때문에 완전한 해결책을 언급하지 않았습니다.
- 외부 결합된 테이블에는 Oracle 문서에 언급된 기본 키가 있어야 합니다.
- 쿼리에 다른 제약 조건이 있으면 안 됩니다. 즉, 다음에 필터 기준이 있으면 안 됩니다.
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
'sourcetip' 카테고리의 다른 글
node_modules 폴더에서 스크립트 빌드 오류를 가져오는 중입니다. (0) | 2023.07.02 |
---|---|
파이썬에서 0xbin()이 False를 반환하는 이유는 무엇입니까? (0) | 2023.07.02 |
mongoDB에 지리공간 정보를 저장하는 방법 (0) | 2023.07.02 |
R(루프)에서 리스트에 요소를 추가하는 방법 (0) | 2023.07.02 |
C에서 포인터가 이미 해제되었는지 어떻게 확인합니까? (0) | 2023.07.02 |