2014-04-13 2 views
0

상위 하위 관계를 포함하는 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에서 어떻게 구현 될 수 있는지 예제를 제공 할 수 있습니까?

답변

0

SQL을 읽기 어려우면 다양한 수준의보기를 만들 수 있습니다.

실제 성능 문제점이있는 경우이를 구체화보기로 만들 수 있습니다.