OUTER JOIN 쓸 때 ON과 WHERE에 주는 조건 차이 주의

LEFT OUTER JOIN을 진행할 때 이런 경우가 있다.

모두 보여주고자 하는 쪽 (왼쪽) 에서

1) 개인인 경우 : 개인고객정보에서 신용점수를 가져오고

2) 법인인 경우 : 법인고객정보에서 기업등급을 가져오자

 

먼저 개인고객부터 JOIN해보자. 

ID_TYP이 1(개인)인 경우 개인고객정보(TPID)와 JOIN한다.

이때 ID_TYP이 2인 경우 JOIN에 참여하지 않았기 때문에 SCORE 컬럼에는 NULL이 보이지만 

OUTER JOIN이기 때문에 일단 TA에서 들어온 컬럼들은 다 들어와있다. 

이제 두 테이블이 조인되었으니 법인쪽도 JOIN해보자 

ID_TYP이 2(법인)인 경우에만 조인 결과를 들고오지만, 일단 OUTER JOIN의 근본 테이블인 TA의 행들은 없어지지 않고 그냥 나온다. 

 

 

ID_TYP이 1이면 TP에서 SCORE를, 2이면 TC에서 GRADE를 가져오고 있다. 

 

-------------------------------------------------------------------------------------------

★헷갈리지 않도록 주의할 것

여기에서 아예 행 제한을 하고 싶다면 WHERE을 써서 제한해야한다

WHERE TA.IDLNACT = '200266' 

요런 식으로 

-------------------------------------------------------------------------------------------

 

위 ANSI조인의 구문을 오라클조인으로 쓰자면 어떻게 할까? 

 

< 나쁜 예 > 

ORACLE구문에서 JOIN할 때는 JOIN절이 WHERE에 들어가서 일반 조건과 구분할 수가 없다. 

그렇다보니. ID가 1인것 빼고 다 날라가고 , 그 후에 2인것 빼고 다 날라가니 전부 날라가서 결과가 없어져버림 

 

< 좋은 예 >

CASE WHEN이 여기에서도 쓰이는군. 생소하다 

SELECT * 
  FROM TACCOUNT TA 
      ,TPID     TP
      ,TCID     TC 
 WHERE CASE TA.ID_TYP WHEN '1' THEN TA.LNID END = TP.LNID (+)
   AND CASE TA.ID_TYP WHEN '2' THEN TA.LNID END = TC.LNID (+) ;

 

DECODE로도 가능하지 

SELECT TA.LNACT, TA.ID_TYP, TA.LN_AMT, TP.SCORE, TC.GRADE
  FROM TACCOUNT TA, TPID TP, TCID TC
 WHERE DECODE (TA.ID_TYP, 1, TA.LNID) = TP.LNID (+)
   AND DECODE (TA.ID_TYP, 2, TA.LNID) = TC.LNID (+) ;

 

 

그러나 해소되지 않은 의문

이건 무엇인가 

 

'근거 있는 일하기_SQL' 카테고리의 다른 글

Exist 서브쿼리  (1) 2024.05.06
조건절의 서브쿼리 (where, having)  (0) 2024.05.06
JOIN  (0) 2024.04.20
조건문_DECODE, CASE WHEN  (0) 2024.04.20
오라클 날짜는 항상 시분초를 달고다닌다  (0) 2024.04.19