Forest Gump?

SQL union all, outer join차이와 union all 열로 붙이기. 본문

카테고리 없음

SQL union all, outer join차이와 union all 열로 붙이기.

code1010 2022. 3. 29. 17:57

UNION ALL과 OUTER JOIN의 차이는 , UNION ALL은 행의 합집합으로 나열하고 , OUTER JOIN은 열의 합집합으로 나열하는 차이 이라고 볼 수 있다.
하지만, 실무에서 쓰다 보니 LEFT OUTER JOIN으로 조인을 할 시, 기준이 되는 테이블의 데이터가 없으면 NULL로 처리되는 경우가 생겨서 다른 방법이 없나 생각을 해봤다. 

그러다가 UNION ALL 을 이용해 행의 합집합이 아닌, 열의 합집합으로 붙이는 방법을 찾아내서 공유해본다. 

 

예를들어 A란 테이블에서 A1,A2의 값을 날짜 기준으로 SELECT 하면 QUERY는 왼쪽과 같고 결과값은 우측과 같다.

 

여기서 같은 방식으로, B란 테이블에서 B3의 값을 날짜 기준으로 SELECT 한다면 다음과 같을것이다. 

그럼 여기서, 둘을 공통된 YYYYMM의 날짜 값을 묶고 싶다면, 보통은 OUTER JOIN으로 써서 값을 조회할 것이다. 

 

결과는 이렇게 정상적으로 출력 될 것이다. 하지만 이렇게 단순하지 않은 테이블로 SELECT 할 경우, NULL값들이 많이들 나와서 곤란한 결과가 생겼다. 그래서 다른 방법이 없나 고심끝에, UNION ALL을 접목시켜보기로 했다. 

 

열이 아닌 행의 합집합이라고 생각했던 UNION으로도 동일한 결과를 낼 수 있는 방법을 찾았다! 

동일한 컬럼을 지정해주고 (stat3의 값이 sum(200)이면 합산된 결과가 나올것임!) union all을 해주면

이렇게 열로 붙일 수 있다.

 

이렇게 단순한 쿼리로 정리하면 참 쉬워보이는데 , 결과 row가 몇십개 씩 나오고 서브쿼리로 몇번씩 wrap되있는 쿼리를 재사용해서 쓰려니까 거의 하루가 다 날아갔다..역시 남의 쿼리를 쪼개서 만드는것 보다 처음부터 다시 짜는게 낫다고 느끼는 하루.