금백조의 개발 블로그

[MSSQL]FULL OUTER JOIN 개념 및 예제(FULL JOIN 합집합) 본문

Database/SQL Server(MSSQL)

[MSSQL]FULL OUTER JOIN 개념 및 예제(FULL JOIN 합집합)

금백조 2021. 7. 17. 23:15
반응형

서론

 

개발 요구 사항 중 기준일자 별로 변경된 품목의 설계서를 비교해야 하는 요구 사항이 있었습니다. 예를 들어 A품목이 있다면 2021-01-01 일자의 A품목의 부품은 B1, B2, C1이었는데 2021-07-17 일자의 A품목 부품은 B1, B3, C3로 변경될 수 있습니다. 이 경우 아래와 같이 부품의 순서는 유지하면서 추가, 삭제된 부품엔 빈 행을 추가하여 데이터를 조회해야 했습니다.

 

 

저는 두 데이터를 비교하여 빈행을 추가시키기 위해 FULL OUTER JOIN을 사용하여 해결했습니다. 따라서 이번 포스팅에서는 위 과정 속에서 알게된 FULL OUTER JOIN의 개념과 예제에 대해 정리해보겠습니다.

 


 

본론

 

[구문 형식]

 

SELECT ...
FROM T1 FULL OUTER JOIN T2 ON T1.COL1 = T2.COL1...

 

[특징]

  • FULL OUTER JOIN 은 위 그림과 같이 테이블(T1,T2) 간의 합집합을 나타냅니다.
  • T1에는 존재하고 T2에는 존재하지 않는 컬럼값, T2에는 존재하고 T1에는 존재하지 않는 컬럼값 모두 NULL로 표현됩니다.

[예제]

 

SELECT 
	A.ITEM,
	A.CHILD_ITEM,
	B.ITEM,
	B.CHILD_ITEM,
	CASE WHEN A.SEQ IS NULL THEN B.SEQ ELSE A.SEQ END AS SEQ--부품의 순서를 유지하기 위한 가공 컬럼 추가
FROM
(
	SELECT 'A' ITEM, 'B1' CHILD_ITEM, 1 SEQ
	UNION ALL
	SELECT 'A' ITEM, 'B2' CHILD_ITEM, 2 SEQ
	UNION ALL
	SELECT 'A' ITEM, 'C1' CHILD_ITEM, 3 SEQ
)A
FULL JOIN
(
	SELECT 'A' ITEM, 'B1' CHILD_ITEM, 1 SEQ
	UNION ALL
	SELECT 'A' ITEM, 'B3' CHILD_ITEM, 2 SEQ
	UNION ALL
	SELECT 'A' ITEM, 'C3' CHILD_ITEM, 3 SEQ
)B ON A.ITEM = B.ITEM AND A.CHILD_ITEM = B.CHILD_ITEM
ORDER BY SEQ

 

[실행 결과]

 

 


 

결론

 

양쪽 데이터 간의 비교를 할 때 추가, 삭제된 데이터를 양쪽 다 빈 행으로 표기해야 하는 요구사항이 꽤 있는 것 같습니다. 이 경우 FULL JOIN을 이용하면 쉽게 빈행을 추가할 수 있는 좋은 방법이라고 생각됩니다.

 

Reference

 

[Microsoft Docs] - [SQL] - [FROM 절과 JOIN, APPLY, PIVOT(Transact-SQL)]

https://docs.microsoft.com/ko-kr/sql/t-sql/queries/from-transact-sql?view=sql-server-ver15 

 

FROM 절과 JOIN, APPLY, PIVOT(T-SQL) - SQL Server

FROM 절과 JOIN, APPLY, PIVOT(Transact-SQL)

docs.microsoft.com

 

반응형