상위 하위 관계를 포함하는 6 개의 레벨 테이블이 있으며 테이블 하나에는 각 레벨의 모든 오브젝트 이름에 대한 세부 사항이 들어 있습니다. 한 수준 개체와 다른 수준 개체의 관계를 포함하는 새 테이블로 데이터를 이동해야합니다. 지구, 마을, 도시, 주, 국가 간의 관계 샵을 예로 든다. 따라서 테이블에는 모든 지구와 도시, 주와 지방의 매핑에 대한 세부 정보가 있습니다.Oracle SQL (임시 테이블, 콜렉션) 조정
아래의 쿼리는 다른 모든 수준의 지구 수준에 대한 것입니다. 다른 모든 수준에 대해 비슷한 쿼리를 준비해야합니다.
WITH LEVEL1 AS
(SELECT NAME, CHILDNAME
FROM S_LEVEL1 P),
LEVEL2 AS
(SELECT NAME, CHILDNAME FROM S_LEVEL2),
LEVEL3 AS
(SELECT NAME, CHILDNAME FROM S_LEVEL3),
LEVEL4 AS
(SELECT NAME, CHILDNAME FROM S_LEVEL4),
LEVEL5 AS
(SELECT NAME, CHILDNAME FROM S_LEVEL5),
LEVEL6 AS
(SELECT NAME, CHILDNAME FROM S_LEVEL6),
REL_LEVEL AS
(SELECT DISTINCT NAME
FROM S_RELATIONSHIP
WHERE TYPE ='LEVEL0' ) ,
REL_ALL_LEVEL AS
(SELECT DISTINCT NAME,TYPE
FROM S_RELATIONSHIP
WHERE TYPE in ('LEVEL1','LEVEL2','LEVEL3','LEVEL4','LEVEL5','LEVEL6' ) ,
Select distinct REL_LEVEL.NAME,'LEVEL0',LEVEL1.NAME,'LEVEL1'
from REL_LEVEL, LEVEL1
where REL_LEVEL.NAME=LEVEL1.CHILDNAME
and exists (Select 1 from REL_ALL_LEVEL where REL_ALL_LEVEL.NAME= LEVEL1.NAME and REL_ALL_LEVEL.TYPE ='LEVEL1')
union all
Select distinct REL_LEVEL.NAME,'LEVEL0',LEVEL2.NAME,'LEVEL2'
from REL_LEVEL, LEVEL1,LEVEL2
where REL_LEVEL.NAME=LEVEL1.CHILDNAME
and LEVEL1.NAME= LEVEL2.CHILDNAME
and exists (Select 1 from REL_ALL_LEVEL where REL_ALL_LEVEL.NAME= LEVEL2.NAME and REL_ALL_LEVEL.TYPE ='LEVEL2')
union all
Select distinct REL_LEVEL.NAME,'LEVEL0',LEVEL3.NAME,'LEVEL3'
from REL_LEVEL, LEVEL1,LEVEL2,LEVEL3
where REL_LEVEL.NAME=LEVEL1.CHILDNAME
and LEVEL1.NAME= LEVEL2.CHILDNAME
and LEVEL2.NAME= LEVEL3.CHILDNAME
and exists (Select 1 from REL_ALL_LEVEL where REL_ALL_LEVEL.NAME= LEVEL3.NAME and REL_ALL_LEVEL.TYPE ='LEVEL3')
union all
Select distinct REL_LEVEL.NAME,'LEVEL0',LEVEL4.NAME,'LEVEL4'
from REL_LEVEL, LEVEL1,LEVEL2,LEVEL3,LEVEL4
where REL_LEVEL.NAME=LEVEL1.CHILDNAME
and LEVEL1.NAME= LEVEL2.CHILDNAME
and LEVEL2.NAME= LEVEL3.CHILDNAME
and LEVEL3.NAME= LEVEL4.CHILDNAME
and exists (Select 1 from REL_ALL_LEVEL where REL_ALL_LEVEL.NAME=LEVEL4.NAME and REL_ALL_LEVEL.TYPE ='LEVEL4')
union all
Select distinct REL_LEVEL.NAME,'LEVEL0',LEVEL5.NAME,'LEVEL5'
from REL_LEVEL, LEVEL1,LEVEL2,LEVEL3,LEVEL4,LEVEL5
where REL_LEVEL.NAME=LEVEL1.CHILDNAME
and LEVEL1.NAME= LEVEL2.CHILDNAME
and LEVEL2.NAME= LEVEL3.CHILDNAME
and LEVEL3.NAME= LEVEL4.CHILDNAME
and LEVEL4.NAME= LEVEL5.CHILDNAME
and exists (Select 1 from REL_ALL_LEVEL where REL_ALL_LEVEL.NAME=LEVEL5.NAME and REL_ALL_LEVEL.TYPE ='LEVEL5')
내가 WITH
절을 사용하지만 각 수준에 대해 내가 (아래 쿼리 내가 같은 쿼리 6 번 작성해야 6 개 수준, 한 단계입니다 시간의 동일한 쿼리 (6) 번호를 기입해야합니다 단순화하기). 내 질문은 .. 거기에 각 수준에 대한 몇 가지 임시 테이블에 데이터를 저장할 수있는 방법은 내가 거기에 필요한 데이터를 얻으려면 SQL 재생할 수 있습니다.
나는 MSSQL에서 일한 바있다. 그리고 나는 각 레벨에 대해 별도의 임시 테이블을 만든 다음 그 위에 인덱스를 만들고 자식 프로 시저에서 필요한 임시 테이블을 사용하여 필요한 데이터를 얻는다. 그러나 오라클에서 이것을 구현하는 방법을 잘 모르겠습니다.
내가 찾는 한 가지 방법은 각 레벨마다 별도의 중첩 테이블을 사용하고 BULK Collect를 사용하여 중첩 테이블로 데이터를 이동 한 다음 동일한 패키지에 여러 번 중첩 테이블을 다시 사용하는 것입니다. 이것이 의미가 있거나 더 좋은 방법이 있습니까?
누군가가 Oracle에서 어떻게 구현 될 수 있는지 예제를 제공 할 수 있습니까?