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 |