TABLE 1
PJT_SQ, DEPT, UNIT, CONTENT
1001 부서1 유닛1 내용1
1001 부서2 유닛2 내용2
1002 부서1 유닛3 내용3
1002 부서2 유닛4 내용3
TABLE2
PJT_SQ, PJT_NM
1001 프로젝트1
1002 프로젝트2
식으로 2개 테이블을 조인하려고 합니다.
출력형태는
1번컬럼 2번컬럼
프로젝트1
DEPT1
UNIT1
CONTENT
CONTENT
UNIT2
CONTENT
DEPT2
UNIT1
CONTENT
프로젝트2
DEPT1
UNIT1
CONTENT
화면단에서는 프로젝트를 열면 프로젝트에 속한 DEPT가 나오고
거기서 DEPT를 또 열면 UNIT이 나오고 유닛을 열면 나머지 유닛에 속한 내용이 나오는 식입니다.
부모 자식관계가 마땅히 없는데 어떤식으로 해야할지요..
예제 봐봣는데도 햇갈리네요
어차피 순차적으로 선택하는 거라면 아래처럼 쿼리르 만들어서 사용하시는 편이 좋을 듯 합니다.
1. 프로젝트 열기
SELECT PJT_SQ, PJT_NM
FROM TABLE2
;
2. 선택한 프로젝트의 DETP 보이기
SELECT DEPT
FROM TABLE1
WHERE PJT_SQ = '1001'
;
3. 선택한 DETP의 UNIT 보이기
SELECT UNIT
FROM TABLE1
WHERE PJT_SQ = '1001'
AND DETP = '부서1'
;
4. 선택한 UNIT의 CONTENT 보이기
SELECT CONTENT
FROM TABLE1
WHERE PJT_SQ = '1001'
AND DETP = '부서1'
AND UNIT = '유닛1'
;
이미 테이블 구조를 제귀호출 형태로 만들지 않았기 때문에..
기존 데이터들을 조합해서 트리 구조로 만들면..
앞으로 프로젝트가 많아지면 많은 데이터들을 다시 모두 조합하기 위해
쓸때없이 전체 데이터를 읽어야 하는 일이 발생해서 효율적으로 좋지 않을 수 있습니다.
만약 위에 출력 형태처럼 전체 데이터를 보여줘야 하는 화면이 있나요?
WITH TABLE1(PJT_SQ, DEPT, UNIT, CONTENT) AS( SELECT '1001', '부서1', '유닛1', '내용1' FROM DUAL UNION ALL SELECT '1001', '부서2', '유닛2', '내용2' FROM DUAL UNION ALL SELECT '1002', '부서1', '유닛3', '내용3' FROM DUAL UNION ALL SELECT '1002', '부서2', '유닛4', '내용3' FROM DUAL ) , TABLE2(PJT_SQ, PJT_NM) AS ( SELECT '1001', '프로젝트1' FROM DUAL UNION ALL SELECT '1002', '프로젝트2' FROM DUAL ) SELECT LPAD(' ', 4*(LEVEL-1)) || CD_NM AS CD_NM , DECODE(CONNECT_BY_ISLEAF,0,LPAD(' ', 4*(LEVEL-1)) || CD_NM) COL1 , DECODE(CONNECT_BY_ISLEAF,1,CD_NM) COL2 FROM ( SELECT PJT_SQ CD , NULL UP_CD , PJT_NM CD_NM FROM TABLE2 UNION ALL SELECT DECODE(LV, 1, PJT_SQ||DEPT, 2, PJT_SQ||DEPT||UNIT, 3, CONTENT) CD , DECODE(LV, 1, PJT_SQ, 2, PJT_SQ||DEPT, 3, PJT_SQ||DEPT||UNIT) UP_CD , DECODE(LV, 1, DEPT, 2, UNIT, 3, CONTENT) CD_NM FROM TABLE1 AA , (SELECT LEVEL LV FROM DUAL CONNECT BY LEVEL <= 3) BB ) START WITH UP_CD IS NULL CONNECT BY PRIOR CD = UP_CD ;
SELECT NULL UP_CD , PJT_SQ CD FROM TABLE2 UNION ALL SELECT DECODE(LV, 1, PJT_SQ, 2, DEPT, 3, UNIT) UP_CD , DECODE(LV, 1, DEPT, 2, UNIT, 3, CONTENT) CD FROM TABLE1 AA , (SELECT LEVEL LV FROM DUAL CONNECT BY LEVEL <= 3) BB ;
이렇게 하면 됩니다만..
전제 조건으로 PJT_SQ, DEPT, UNIT들이 서로 중복 되지 않아야 합니다.
그래야만 아래처럼 쿼리 했을때 트리구조가 완성이 됩니다.
SELECT DECODE(CONNECT_BY_ISLEAF,0,LPAD(' ', 4*(LEVEL-1)) || CD) COL1 , DECODE(CONNECT_BY_ISLEAF,1,CD) COL2 FROM ( SELECT NULL UP_CD , PJT_SQ CD FROM TABLE2 UNION ALL SELECT DECODE(LV, 1, PJT_SQ, 2, DEPT, 3, UNIT) UP_CD , DECODE(LV, 1, DEPT, 2, UNIT, 3, CONTENT) CD FROM TABLE1 AA , (SELECT LEVEL LV FROM DUAL CONNECT BY LEVEL <= 3) BB ) START WITH UP_CD IS NULL CONNECT BY PRIOR CD = UP_CD ;