기존에 사용하고 있던 쿼리를 유지보수업무 수행을 위해 수정해야했다.
수정해야 하는 쿼리는 Oracle Join이었는데 사용해본 적은 있지만 뭔지도 모르고 사용했던지라 개념이 부족했고, 수정을 했지만 원하는대로 조회가 되지 않아서 한참을 헤맸다.
쿼리를 Ansi Join 에서 Oracle Join으로 바꾼 이유
나는 outer join을 해서 join 테이블에 데이터가 없더라도 null이라도 가져와야 했다.
하지만 기존에 코드가 Oracle Inner Join을 사용하고 있었고, 해당 프로젝트에 DB가 MySQL이었기 때문에 Oracle Join을 유지하면서 쿼리를 수정하기가 어려웠다. 왜냐하면 MySQL에서는 (+)를 붙이면 문법에 오류가 있다는 오류가 생겨 원하는데로 조회가 되지 않았다. 결국 Ansi Join으로 변경하여 쿼리를 수정했다.
1. Ansi Join (안시조인)
SELECT
E.EMP_NO,
E.EMP_NAME,
D.DEPT_NM
FROM EMP AS E -- 메인 테이블
INNER JOIN DEPT AS D -- 조인 테이블
ON E.DEPT_CD = D.DEPT_CD
2. Oracle Join
SELECT
E.EMP_NO,
E.EMP_NAME,
D.DEPT_NM
FROM
EMP AS E, -- 메인 테이블
DEPT AS D -- 조인 테이블
WHERE
E.DEPT_CD = D.DEPT_CD -- 오라클 조인은 조인 조건을 where절에 작성하면 된다
위에 정리한 1번과 2번은 inner join(내부조인) 으로, 즉 메인 테이블과 조인 테이블에 값이 모두 존재해야 조회가 된다.
3. Ansi Join (outer join)
SELECT
E.EMP_NO,
E.EMP_NAME,
D.DEPT_NM
FROM EMP AS E -- 메인 테이블
LEFT OUTER JOIN DEPT AS D -- 조인 테이블
ON E.DEPT_CD = D.DEPT_CD
4. Oracle Join (outer join)
SELECT
E.EMP_NO,
E.EMP_NAME,
D.DEPT_NM
FROM
EMP AS E, -- 메인 테이블
DEPT AS D -- 조인 테이블
WHERE
E.DEPT_CD = D.DEPT_CD(+) -- 조인 테이블에 (+)를 붙여서 사용한다
3번과 4번은 outer join(외부조인) 으로 조인 테이블의 값이 존재하지 않더라도 메인 테이블의 데이터가 모두 조회되며, 조인테이블에 값을 가져오지 못하면 null로 조회된다.
'Database' 카테고리의 다른 글
[MySQL] 현재 시간 insert (0) | 2022.11.22 |
---|---|
[MySQL] 5.7 다운로드 방법 (이미 8.0 버전이 깔려 있는 경우) (0) | 2022.09.20 |
[MySQL] GROUP_CONCAT 사용방법 (0) | 2022.09.19 |
[MySQL] UNION, UNION ALL 연산자 사용법 (0) | 2022.09.19 |
[MySql/Oracle] on duplicate key update(mysql) vs mergeinto(oracle) 사용방법 (0) | 2022.01.10 |