오라클 조인 vs 서브쿼리 0 12 801

by 구루구루구루 [SQL Query] [2019.09.03 11:25:25]


수강테이블과 과제테이블이 다음과 같이 있습니다.

수강테이블

학번 연도 학기 과목 과제코드
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

 

위에 결과테이블처럼 조회하고 싶은 경우에는 어떻게 해야하나요???

꼭 서브쿼리로 해야하나요?


 

by 우리집아찌 [2019.09.03 12:23:07]

샘플데이터 좀 올려주세요.


by 구루구루구루 [2019.09.03 12:59:20]

추가했습니다~


by 우리집아찌 [2019.09.03 13:06:48]
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.과제코드(+)    

 


by 구루구루구루 [2019.09.03 13:21:06]

저도 WHERE 조건 절에 A.과제코드 = B.과제코드(+) 라고 썼는데 왜 결과가 자바프로그래밍만 나오는걸까요ㅠㅠ 추가된 조건은 연도=2019 학기= 1를 추가로 준거밖에 없어요..ㅠㅠ

 


by 우리집아찌 [2019.09.03 13:58:08]

위의 SQL의 결과값이 틀린가요?

그렇지 않으면

쓰고 계신 전체 SQL을 올려주세요.


by 구루구루구루 [2019.09.03 15:17:07]

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'

 

이렇게 연도, 학기 조건만 추가했습니다..!


by 구루구루구루 [2019.09.03 15:24:58]

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'

 

 

이렇게 연도, 학기에도 아우터조인을 추가하니 값이나오네요ㅠㅠ


by 우리집아찌 [2019.09.03 16:00:38]

조인이 저거 말고 더 있으신가보네요.


by 꼬랑지 [2019.09.03 14:17:44]
아웃터 조인을 반대로 하신거 아녀요?

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

 


by 구루구루구루 [2019.09.03 15:17:20]

아우터조인을 반대로 해도 결과는 똑같아요..ㅠㅠ


by 마농 [2019.09.04 09:07:09]

위 쿼리대로 했으면 나와야 하는게 정상입니다.
안나온다면? 실제 쿼리는 위 쿼리와 다르게 작성되었다고 보는 수 밖에 없습니다.


by smileHaHa [2019.09.06 11:05:11]

SELECT 
   TB01.학번
   ,TB01.연도
   ,TB01.학기
   ,TB01.과목
   ,TB01.과제코드
   ,TB02.과제명
   ,TB02.조교
   ,TB02.과제점수
FROM 
   수강테이블 TB01
   LEFT JOIN 과제테이블 TB02
   ON TB01.과제코드 = TB02.과제코드

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입