조인 쿼리 질문입니다. 0 6 6,411

by 커피요쿠르트d [SQL Query] JOIN SQL QUERY ORACLE [2013.02.01 16:58:09]


수고하십니다.

즐거워야할  금요일인데.. 하나도 안 즐겁네요. ㅠㅠ

안풀리는 문제가 있어 질문드립니다..



두 테이블이 있습니다.

하나는 특정 전공의 학생이 꼭 이수해야할 필수 강좌들이 있는 테이블

하나는 학생이 이수한 강좌 목록..테이블.

이 두 테이블을 조인하여..

학생이 전공한 전공의 필수 과목 리스트를 보여주고 거기에 학생의 이수정보, 학점같은... 를 보여줄려고 하는데요..

이게 쉬운거 같은데.. 

잘 안되네요. ㅠㅠ




보기 쉽게  자료를 올려봅니다..







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 사용중입니다. 
도움바랍니다.

그럼 즐거운 주말 되시길 바랍니다. 

by 아발란체 [2013.02.01 17:12:17]
--LEFT OUTER JOIN 입니다.
--타 DBMS에서는 (+)가 아닌 LEFT OUTER JOIN 구문으로 사용해야 합니다.(오라클은 둘 다 지원)
SELECT
  TBL1.*, DECODE(TBL2.HAKJUM, NULL, 'N', 'Y'), TBL2.HAKJUM
FROM
  TBL1, TBL2
WHERE
  TBL1.CLASS_NM = TBL2.CLASS_NM(+)
  AND TBL1.SUB_NM = TBL2.SUB_NM(+)

by 커피요쿠르트d [2013.02.01 18:14:28]
답변 감사합니다.!!

제가 질문을 잘못 올렸나보네요;; ^^;;

알려주신 쿼리는 해보았습니다.

그러면..
어떤 결과가 나오냐면..

전공1,2,3 모든 리스트가 나옵니다.

제가 원하는 것은..
학생의 이수 정보 테이블에는 전공1,2 정보만 있으니..

전공1,2 리스트만 나오는 상황입니다..

그래서 다시 생각해보니.. 이게
left out join이 아닐 수도 있겠다는 생각이 들어서요..

질문을 수정해야겠네요. !!

관심 감사합니다. !!!

by 제로 [2013.02.01 18:16:15]
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
;

by Oracler [2013.02.03 18:14:47]
-- 원하는 결과대로 나오게 하려면 아래와 같이 하면 됩니다.
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
;

by 커피요쿠르트d [2013.02.04 13:45:07]
죄송합니다. 감사인사가 너무 늦었네요

확인하고 바로 작업하느라.. ㅠㅠ


도움 주신 모든 분들께 감사드립니다. 잘 해결된거 같아요.

이번에 LEFT OUTER JOIN에 대해 다시 알게 되었습니다. 

정말 감사합니다. 

즐거운 한 주 되시길 바랍니다.


by 손님 [2013.04.18 15:14:37]
SELECT TBL1.CLASS_NM, TBL1.SUB_NM, TBL2.HAKJUM
  FROM TBL1 LEFT OUTER JOIN TBL2
   ON (TBL1.CLASS_NM = TBL2.CLASS_NM AND TBL1.SUB_NM = TBL2.SUB_NM )
WHERE TBL1.CLASS_NM IN (SELECT DISTINCT TBL1.CLASS_NM 
FROM TBL1, TBL2
WHERE TBL1.CLASS_NM = TBL2.CLASS_NM
   AND TBL1.SUB_NM = TBL2.SUB_NM )
ORDER BY CLASS_NM, SUB_NM
;
댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입