WITH TBL1 AS ( SELECT '전공1' CLASS_NM, '독서1' SUB_NM FROM DUAL UNION ALL SELECT '전공1' CLASS_NM, '독서2' SUB_NM FROM DUAL UNION ALL SELECT '전공1' CLASS_NM, '독서3' SUB_NM FROM DUAL UNION ALL SELECT '전공1' CLASS_NM, '독서4' SUB_NM FROM DUAL UNION ALL SELECT '전공2' CLASS_NM, '글쓰기1' SUB_NM FROM DUAL UNION ALL SELECT '전공2' CLASS_NM, '글쓰기2' SUB_NM FROM DUAL UNION ALL SELECT '전공2' CLASS_NM, '글쓰기3' SUB_NM FROM DUAL UNION ALL SELECT '전공2' CLASS_NM, '글쓰기4' SUB_NM FROM DUAL UNION ALL SELECT '전공3' CLASS_NM, '오라클' SUB_NM FROM DUAL UNION ALL SELECT '전공3' CLASS_NM, 'MSSQL' SUB_NM FROM DUAL UNION ALL SELECT '전공3' CLASS_NM, 'SYBASE' SUB_NM FROM DUAL UNION ALL SELECT '전공3' CLASS_NM, 'DB2' SUB_NM FROM DUAL UNION ALL SELECT '전공3' CLASS_NM, 'JAVA' SUB_NM FROM DUAL UNION ALL SELECT '전공3' CLASS_NM, '.NET' SUB_NM FROM DUAL UNION ALL SELECT '전공3' CLASS_NM, 'PYTHON' SUB_NM FROM DUAL UNION ALL SELECT '전공3' CLASS_NM, 'C' SUB_NM FROM DUAL ) , TBL2 AS ( SELECT '전공1' CLASS_NM, '독서1' SUB_NM, '2' HAKJUM FROM DUAL UNION ALL SELECT '전공1' CLASS_NM, '독서2' SUB_NM, '3' HAKJUM FROM DUAL UNION ALL SELECT '전공1' CLASS_NM, '놀기' SUB_NM, '1' HAKJUM FROM DUAL UNION ALL SELECT '전공1' CLASS_NM, '잠자기' SUB_NM, '3' HAKJUM FROM DUAL UNION ALL SELECT '전공1' CLASS_NM, '먹기' SUB_NM, '4' HAKJUM FROM DUAL UNION ALL SELECT '전공1' CLASS_NM, '싸기' SUB_NM, '3' HAKJUM FROM DUAL UNION ALL SELECT '전공2' CLASS_NM, '글쓰기1' SUB_NM, '3' HAKJUM FROM DUAL UNION ALL SELECT '전공2' CLASS_NM, '개발' SUB_NM, '3' HAKJUM FROM DUAL UNION ALL SELECT '전공2' CLASS_NM, '디버깅' SUB_NM, '3' HAKJUM FROM DUAL UNION ALL SELECT '전공2' CLASS_NM, '테스트' SUB_NM, '3' HAKJUM FROM DUAL ) SELECT TBL1.CLASS_NM, TBL1.SUB_NM, TBL2.HAKJUM FROM TBL1, TBL2 WHERE TBL1.CLASS_NM = TBL2.CLASS_NM AND TBL1.SUB_NM = TBL2.SUB_NM ;
위는 아우터 조인없이 그냥 조인한 결과인데요... 위 쿼리 결과는 학생이 이수한 과목만 나오는 경우입니다.
SELECT TBL1.CLASS_NM, TBL1.SUB_NM, TBL2.HAKJUM FROM TBL1, TBL2 WHERE TBL1.CLASS_NM = TBL2.CLASS_NM (+) AND TBL1.SUB_NM = TBL2.SUB_NM (+)
위와 같이 left outer join을 걸면...
전공필수 정보가 있는 테이블의 모든 리스트가 나옵니다.
위의 경우에서는 전공 3까지 포함되어 나온다는 말이지요,
제가 원하는 건 필수과목 리스트(학생이 이수한 전공의 리스트 모두...여기서는 전공1, 전공2...-전공3은 제외..)가 나오고 그 뒤에 HAKJUM 칼럼 정보가 붙는 겁니다.
아래에 제가 원하는 결과 데이터셋을 붙입니다.
WITH RESULT AS( SELECT '전공1' CLASS_NM, '독서1' SUB_NM, 'Y' YN, '2' HAKJUM FROM DUAL UNION ALL SELECT '전공1' CLASS_NM, '독서2' SUB_NM, 'Y' YN, '3' HAKJUM FROM DUAL UNION ALL SELECT '전공1' CLASS_NM, '독서3' SUB_NM, 'N' YN, '' HAKJUM FROM DUAL UNION ALL SELECT '전공1' CLASS_NM, '독서4' SUB_NM, 'N' YN, '' HAKJUM FROM DUAL UNION ALL SELECT '전공2' CLASS_NM, '글쓰기1' SUB_NM, 'Y' YN, '3' HAKJUM FROM DUAL UNION ALL SELECT '전공2' CLASS_NM, '글쓰기2' SUB_NM, 'N' YN, '' HAKJUM FROM DUAL UNION ALL SELECT '전공2' CLASS_NM, '글쓰기3' SUB_NM, 'N' YN, '' HAKJUM FROM DUAL UNION ALL SELECT '전공2' CLASS_NM, '글쓰기4' SUB_NM, 'N' YN, '' HAKJUM FROM DUAL ) SELECT * FROM RESULT
위와 같이 학생이 전공한 전공1, 전공2의 목록이 다나오고 해당 row에 학생이 이수한 내역이 있으면 학점 정보를 같이 출력하고자 합니다.
이게 아우터 조인으로 될거 같은데.. 생각해보니 아우터 조인의 경우가 아닌거 같고..
어떻게 처리가 안되네요..
이런 경우는 뭐라고 부르나요.. ㅠㅠ
아.. 오라클 9 사용중입니다.
도움바랍니다.
그럼 즐거운 주말 되시길 바랍니다.
SELECT T1.CLASS_NM AS CLASS_NM , T1.SUB_NM AS SUB_NM , NVL2(T1.HAKJUM, 'Y', 'N') AS YN , T1.HAKJUM AS HAKJUM FROM (SELECT TBL1.CLASS_NM AS CLASS_NM , TBL1.SUB_NM AS SUB_NM , TBL2.HAKJUM AS HAKJUM FROM TBL1, TBL2 WHERE TBL1.CLASS_NM = TBL2.CLASS_NM(+) AND TBL1.SUB_NM = TBL2.SUB_NM(+) ORDER BY CLASS_NM) T1 , (SELECT DISTINCT CLASS_NM FROM TBL2) T2 WHERE T1.CLASS_NM = T2.CLASS_NM ORDER BY CLASS_NM, SUB_NM ;
-- 원하는 결과대로 나오게 하려면 아래와 같이 하면 됩니다. WITH TBL1 AS ( SELECT '전공1' CLASS_NM, '독서1' SUB_NM FROM DUAL UNION ALL SELECT '전공1' CLASS_NM, '독서2' SUB_NM FROM DUAL UNION ALL SELECT '전공1' CLASS_NM, '독서3' SUB_NM FROM DUAL UNION ALL SELECT '전공1' CLASS_NM, '독서4' SUB_NM FROM DUAL UNION ALL SELECT '전공2' CLASS_NM, '글쓰기1' SUB_NM FROM DUAL UNION ALL SELECT '전공2' CLASS_NM, '글쓰기2' SUB_NM FROM DUAL UNION ALL SELECT '전공2' CLASS_NM, '글쓰기3' SUB_NM FROM DUAL UNION ALL SELECT '전공2' CLASS_NM, '글쓰기4' SUB_NM FROM DUAL UNION ALL SELECT '전공3' CLASS_NM, '오라클' SUB_NM FROM DUAL UNION ALL SELECT '전공3' CLASS_NM, 'MSSQL' SUB_NM FROM DUAL UNION ALL SELECT '전공3' CLASS_NM, 'SYBASE' SUB_NM FROM DUAL UNION ALL SELECT '전공3' CLASS_NM, 'DB2' SUB_NM FROM DUAL UNION ALL SELECT '전공3' CLASS_NM, 'JAVA' SUB_NM FROM DUAL UNION ALL SELECT '전공3' CLASS_NM, '.NET' SUB_NM FROM DUAL UNION ALL SELECT '전공3' CLASS_NM, 'PYTHON' SUB_NM FROM DUAL UNION ALL SELECT '전공3' CLASS_NM, 'C' SUB_NM FROM DUAL ) , TBL2 AS ( SELECT '전공1' CLASS_NM, '독서1' SUB_NM, '2' HAKJUM FROM DUAL UNION ALL SELECT '전공1' CLASS_NM, '독서2' SUB_NM, '3' HAKJUM FROM DUAL UNION ALL SELECT '전공1' CLASS_NM, '놀기' SUB_NM, '1' HAKJUM FROM DUAL UNION ALL SELECT '전공1' CLASS_NM, '잠자기' SUB_NM, '3' HAKJUM FROM DUAL UNION ALL SELECT '전공1' CLASS_NM, '먹기' SUB_NM, '4' HAKJUM FROM DUAL UNION ALL SELECT '전공1' CLASS_NM, '싸기' SUB_NM, '3' HAKJUM FROM DUAL UNION ALL SELECT '전공2' CLASS_NM, '글쓰기1' SUB_NM, '3' HAKJUM FROM DUAL UNION ALL SELECT '전공2' CLASS_NM, '개발' SUB_NM, '3' HAKJUM FROM DUAL UNION ALL SELECT '전공2' CLASS_NM, '디버깅' SUB_NM, '3' HAKJUM FROM DUAL UNION ALL SELECT '전공2' CLASS_NM, '테스트' SUB_NM, '3' HAKJUM FROM DUAL ) SELECT TBL1.CLASS_NM, TBL1.SUB_NM , NVL2(TBL2.HAKJUM, 'Y', 'N') AS YN , TBL2.HAKJUM FROM TBL1, TBL2 WHERE TBL1.SUB_NM = TBL2.SUB_NM (+) AND TBL1.CLASS_NM '전공3' ORDER BY 1, 2 ;