오늘은 Ansi join과 Oracle join에 대해서 알아보겠다.
처음에 SQL을 접했을 때는 Oracle로만 연습해 보아서 그냥 자연스럽게(?) 됐던 것 같은데
이제 와서 다른 것 조금 했다고 또 다 잊어버리다니... (그리고 Ansi join이 더 직관적이다 내생각...)
머릿속에서 두개가 하나가 되어 매일 뻘 코딩을 하고 있어서 따로 정리해봤다.
ANSI 표준 SQL은 조인 조건을 ON절에 달아주고, WHERE절에는 검색조건을 달아준다.
아래 예시
SELECT A.BUSINESS AS "BUSINESS"
, NVL(A.BNAME,'') AS "BNAME"
, NVL(A.TYPE,'') AS "TYPE"
, NVL(B.ENTRY_NM,'') AS "BIZNAME"
FROM COM.BIZCD A
LEFT OUTER JOIN COM.MST_CMM_DTL B
ON A.BUSINESS = B.CMM_CD
AND B.CMM_GRP_CD = 'S05'
LEFT OUTER JOIN COM.MST_CMM_DTL C
ON A.CATEGORY = C.CMM_CD
AND C.CMM_GRP_CD = 'S10'
WHERE 1 = 1
뭐지 이거 줄맞추기 약간 짜증나네 (혼신의 힘으로 맞췄는데 안맞는다...?)
하여튼간 이런식으로 LEFT OUTER JOIN을 실행해주는데
1. 합치려고 하는 테이블 A, B가 있을 때 기준이 되는 테이블을 FROM절에 넣어준다
2. 거기다가 합치려고 하는 B를 LEFT OUTER JOIN 과 함께 넣어준다.
3. ON을 통해서 조건을 추가해준다. (AND로 묶어서 여러개의 조건을 추가해 줄 수 있음)
4. WHERE 절에는 검색 조건을 달아주는데 그냥 1 = 1로 넣었다.
여기서 주의해야 할 점은 조건을 ON으로 적어주느냐 아니면 WHERE로 주느냐에 따라 때로 값이 달라질 수 있다.
그래서 때로 LEFT OUTER JOIN을 했는데 INNER JOIN과 같은 결과를 내는 것이다.
LEFT OUTER JOIN은 합집합, INNER JOIN은 교집합으로 간단하게 이해하면 쉬운데 예상한 결과를 얻었다면 문제없으나
본인이 예상하지 않은 결과값을 얻게 될 수 있으므로 QUERY를 짤 때 조건을 유의해서 넣어야한다.
SQL문의 진행 순서
from on join where ---->
조금 더 자세하게 설명하자면 앞에 언급한 것처럼 조인 조건을 ON절에 달아주고, WHERE절에는 검색조건을 달아주기 때문에 조인 조건인 ON에 넣은 후에 LEFT OUTER JOIN을 하게되면 이미 조건으로 걸러진 내용만을 남아서 다른 테이블과 병합된다.
WHERE절에 조건을 넣을 경우에는 먼저 JOIN이 일어난 후 WHERE절에서 넣은 조건으로 SORTING되는 원리이므로 INNER JOIN의 결과와 같은 값을 얻을 수도 있는 것이다.
앞에 방법이 맞고 뒤에 방법이 틀리다의 개념이 아니라 내가 원하는 검색 조건에 맞게끔 값을 뽑아내는 것이 중요한데 자기가 설계한 대로 값만 나오면 되니까 생각한 대로 나올 수 있도록 유의해서 작성해야 한다는 것이다.
위에 만들었던 ANSI JOIN을 ORACLE JOIN으로 변경해보았다.
SELECT A.BUSINESS AS "BUSINESS"
, NVL(A.BNAME,'') AS "BNAME"
, NVL(A.TYPE,'') AS "TYPE"
, NVL(B.ENTRY_NM,'') AS "BIZNAME"
FROM COM.BIZCD A
, COM.MST_CMM_DTL B
, COM.MST_CMM_DTL C
WHERE A.BUSINESS = B.CMM_CD(+)
AND B.CMM_GRP_CD = 'S05'
AND A.CATEGORY = C.CMM_CD(+)
AND C.CMM_GRP_CD = 'S10'
예제를 검색했을때 보통 2개 테이블 조인 형태만 나와서 조건절을 어떻게 연결해야될지 약간 헷갈렸다.
하지만 그냥 AND로 연결해주면 되었던 것 ^^;
두개는 더 간단하다 (사실 큰 차이없는데 혼자 헤맴주의)
1. FROM 절에 병합하고자하는 테이블을 ,로 연결해준다.
2. WHERE 절에 조건을 넣어주는데 A 테이블 값 = B 테이블 값 이렇게 써주고 붙이고자 하는 테이블쪽에 (+)를 하면된다.
3. 그 외에 조건은 AND로 연결해준다.
B TABLE과 C TABLE이 동일한데 각각 B, C로 해준것은 아래 조건절 중에 'S05', 'S10'과 매칭하는 과정에서 따로 지정해줘야 되기 때문에 그렇게 했다고 이해하면 될것 같다.
일단 나는 이렇게 해서 같은 결과를 얻었는데 아니라고 하면 또 한번 고민해봐야할 것 같다. -_-;;;
저는 초보니까 저의 모든 말을 너무 맹신하지 말아주세요
하지만 최선을 다했읍니다.... 후후...
'문과생애긔개발자_공부 > SQL' 카테고리의 다른 글
POSTGRE SQL (WHERE, ROUND, BETWEEN, OR, IN) 초보단계 (0) | 2022.07.18 |
---|---|
POSTGRE SQL (DISTINCT, GROUP BY, HAVING, SUBQUERY, IN, SUM, AVG) 왕초보단계 (0) | 2022.07.12 |
POSTGRE SQL (GROUP BY, NULL, COUNT) 왕초보단계 (0) | 2022.07.12 |
POSTGRE SQL (AS, WHERE, GROUP BY, %, DESC) 왕초보단계 (0) | 2022.07.12 |
POSTGRE SQL (SELECT, ORDER BY, DESC, 주석달기) 왕초보단계 (0) | 2022.07.12 |