작성일자 : 2024-09-08
Ver 0.1.1
0. 배경
쿼리를 짜다보면 상황에 따라 FULL OUTER JOIN이 필요할 때가 있다.
A, B 테이블이 있다고 했을 때 KEY값으로 Mapping이 안됐을때에도 Table에 포함시키는 JOIN이다.
상용화된 RDB 중 Oracle에서는 INNER, LEFT, RIGHT와 동일하게 FULL OUTER JOIN이라는 구문을 통해 이를 구현할 수 있지만,
MySQL에서는 아쉽게도 이를 지원하지 않는다. 이에 다른 방법으로 FULL OUTER JOIN을 구현해야하는데 그 방법에 대해서 정리해보도록 하겠다.
-- Oracle의 FULL OUTER JOIN
SELECT A.Date
,A.CuntryID
,A.Units
,B.Country
FROM A
FULL
OUTER
JOIN B
ON A.CountryID = B.ID
1. 구현 방법
MySQL에서는 LEFT JOIN, UNION, RIGHT JOIN을 활용하여 FULL OUTER JOIN과 같은 결과를 구현한다.
A 테이블 기준으로 JOIN된 결과와 B 테이블 기준으로 JOIN된 테이블을 위아래로 UNION하는 방식이다.
-- MySQL의 LEFT, RIGHT, UNION 을통한 FULL OUTER JOIN 구현
SELECT A.Date
,A.CountryID
,A.Units
,B.Country
FROM A
LEFT
JOIN B
ON A.CountryID = B.ID
UNION
SELECT A.Date
,A.CountryID
,A.Units
,B.Country
FROM A
RIGHT
JOIN B
ON A.CountryID = B.ID
이때 주의 사항은 UNION ALL이 아닌 UNION을 사용해야한다는 것이다.
UNION을 사용하면 행에 대해서 중복 제외를 하지만,
UNION ALL을 하면 중복도 포함시키기 때문에 원하는 결과를 얻지 못한다.
UNION을 적용하기 위해서는 UNION 기준으로 위아래 쿼리의 컬럼 명과 컬럼 형태, 컬럼의 수도 동일해야 한다.
FULL OUTER JOIN 구문이 있다면 비교적 짧게 구현을 할 수 있겠으나,
MySQL에서는 이를 지원하지 않으니, LEFT, RIGHT JOIN과 UNION 형태로 이를 구현할 수 있다.