수강테이블과 과제테이블이 다음과 같이 있습니다.
수강테이블
학번 | 연도 | 학기 | 과목 | 과제코드 |
000001 | 2019 | 1 | 데이터베이스 | |
000001 | 2019 | 1 | 자바프로그래밍 | W1 |
과제테이블
과제코드 | 과제명 | 조교 | 과제점수 |
W1 | 프로젝트1 | 홍길동 | 50 |
W2 | 프로젝트2 | 김길동 | 80 |
결과테이블
학번 | 연도 | 학기 | 과목 | 과제코드 | 과제명 | 조교 | 과제점수 |
000001 | 2019 | 1 | 데이터베이스 | ||||
000001 | 2019 | 1 | 자바프로그래밍 | W1 | 프로젝트1 | 홍길동 | 50 |
특정 학생의 특정연도, 학기에 수강하는 과목을 모두 출력하고
만약 과제코드가 있으면 과제테이블에서 해당과제코드의 데이터들을 가져오려고 합니다.(없으면 빈값처리)
그런데 select 컬럼부분에서 서브쿼리로 과제정보를 가져오자니 서브쿼리를 3번 날려야하고
과제코드로 조인을 하자니 수강테이블에서 과제코드가 null인 수강테이블 값은 조회가안되네요ㅠㅠ(아우터조인으로 해도요..)
다음과 같이 출력되어버립니다.
학번 | 연도 | 학기 | 과목 | 과제코드 | 과제명 | 조교 | 과제점수 |
000001 | 2019 | 1 | 자바프로그래밍 | W1 | 프로젝트1 | 홍길동 | 50 |
위에 결과테이블처럼 조회하고 싶은 경우에는 어떻게 해야하나요???
꼭 서브쿼리로 해야하나요?
WITH CLASS_TERM (학번,연도,학기,과목,과제코드 ) AS ( SELECT 000001 , '2019' , 1 , '데이터베이스' , NULL FROM DUAL UNION ALL SELECT 000001 , '2019' , 1 , '자바프로그래밍' ,'W1' FROM DUAL ) , HOME_WORK (과제코드,과제명,조교,과제점수 ) AS ( SELECT 'W1' , '프로젝트1' ,'홍길동' , 50 FROM DUAL UNION ALL SELECT 'W2' , '프로젝트2' ,'홍길동' , 80 FROM DUAL ) SELECT A.학번,A.연도,A.학기,A.과목,A.과제코드,B.과제명,B.조교,B.과제점수 FROM CLASS_TERM A , HOME_WORK B WHERE A.과제코드 = B.과제코드(+)
아웃터 조인을 반대로 하신거 아녀요? WITH CLASS_TERM (학번,연도,학기,과목,과제코드 ) AS ( SELECT 000001 , '2019' , 1 , '데이터베이스' , NULL FROM DUAL UNION ALL SELECT 000001 , '2019' , 1 , '자바프로그래밍' ,'W1' FROM DUAL ) , HOME_WORK (과제코드,과제명,조교,과제점수 ) AS ( SELECT 'W1' , '프로젝트1' ,'홍길동' , 50 FROM DUAL UNION ALL SELECT 'W2' , '프로젝트2' ,'홍길동' , 80 FROM DUAL ) SELECT A.학번,A.연도,A.학기,A.과목,A.과제코드,B.과제명,B.조교,B.과제점수 FROM CLASS_TERM A , HOME_WORK B WHERE A.과제코드(+) = B.과제코드 AND A.연도 = '2019' AND A.학기=1