SQL 구문에서 UNION을 사용하여 여러 테이블의 데이터를 한번에 합쳐서 조회할 때 중복 데이터가 있을 경우 원하는 특정 테이블의 데이터만 가져오도록 하려면 어떻게 하면 될까요?
예를 들어 ‘Table1’ 테이블과 ‘Table2’ 테이블이 있다고 했을 때, ‘Table1’과 ‘Table2’를 UNION 했을 경우 두 테이블의 데이터를 모두 한꺼번에 가져오게 됩니다.
두 테이블의 Row 데이터가 서로 다른 경우에는 상관이 없지만 중복되는 Row 데이터가 있는 경우 원하는 테이블 하나에서만 가져와야 하는 경우가 생기게 됩니다.
이번 글에서는 SQL UNION 두 테이블에 중복 데이터가 있을 경우 우선 순위 한 테이블에서 조회 방법에 대해 알아보겠습니다.
MSSQL, ORACLE, MySQL 등에서 공통으로 사용할 수 있는 구문입니다.
SQL UNION 구문에서 중복 데이터가 있을 경우 특정 테이블에서만 가져오는 방법
SQL 구문에서 UNION은 여러 쿼리문을 합쳐서 하나의 쿼리문으로 만들어주는 기능을 수행합니다.
일반적인 UNION(또는 UNION ALL) 구문의 사용 예제 입니다.
SELECT ‘tbl1’ as TableName, Month, Payment FROM tbl1 WHERE Month >= ‘202406’ AND Month <= ‘202411’ UNION SELECT ‘tbl2’ as TableName, Month, Payment FROM tbl2 WHERE Month >= ‘202406’ AND Month <= ‘202411’ |
위의 쿼리를 실행했을 때 아래와 같이 결과가 출력 됩니다.
tbl1 테이블에는 202406부터 202411까지 6건의 Row가 있고, tbl2 테이블에는 8월과 9월 데이터 빠진 4건의 Row가 있는 것을 보실 수 있습니다.
만약 두 개의 테이블에서 데이터를 합쳤어 가져온다고 했을 때 MONTH 컬럼 값이 중복될 경우 tbl2 테이블의 데이터를 선택해서 가져오도록 쿼리 구문을 변경해 보겠습니다.
SELECT ‘tbl1’ as TableName, A.Month, A.Payment FROM tbl1 A WHERE Month >= ‘202406’ AND Month <= ‘202411’ AND (NOT EXISTS (SELECT 1 FROM tbl2 B WHERE B.MONTH = A.MONTH)) UNION ALL SELECT ‘tbl2’ as TableName, Month, Payment FROM tbl2 WHERE Month >= ‘202406’ AND Month <= ‘202411’ |
위의 쿼리 구문을 실행한 결과는 아래 화면과 같습니다.
- 2024년 06월, 07월, 10월, 11월은 tbl1 테이블과 tbl2 테이블 두 테이블 모두 존재하지만 tbl2 테이블에서 가져옵니다.
- 2024년 08월, 08월은 tbl2 테이블에는 없기 때문에 tbl1 테이블에서 가져옵니다.
- 결론적을 두 테이블에서 한 테이블에만 존재하는 데이터는 해당 테이블에서 가져오고 두 테이블에 중복으로 데이터가 존재하는 경우 특정 테이블에서만 가져오도록 하는 쿼리 구문입니다.
SQL EXISTS 연산자
SQL 구문에서 EXISTS 연산자는 서브 쿼리에 데이터가 존재하는지 체크하는 구문입니다. 데이터가 존재할 경우 TRUE를 반환하고, 존재하지 않을 경우 FALSE를 반환합니다.
NOT EXISTS는 EXISTS의 반대 값을 반환합니다.
앞 단락에서 서술한 NOT EXISTS (SELECT 1 FROM tbl2 BWHERE B.MONTH = A.MONTH) 구문은 tbl1 테이블의 데이터를 가져올 때 tbl2 테이블에서 동일 월(MONTH) 컬럼의 데이터가 없을 경우에 가져오도록 처리하는 구문입니다.
EXISTS 앞에 NOT를 붙여줌으로 인해 존재하지 않을 경우만 처리하게 됩니다.
마무리
이상으로 여러 테이블 중에 한 테이블에만 존재하는 데이터는 해당 테이블에서 가져오고, 여러 테이블에 중복으로 데이터가 존재하는 경우 특정 선택한 테이블에서만 가져오도록 하는 쿼리 구문에 대한 설명을 해 보았습니다.
UNION 구문을 사용하여 여러 테이블을 합쳐서 데이터를 가져올 때 EXISTS 구문을 활용하여 중복되는 데이터만 또는 중복되지 않는 데이터만 가져오는 방법을 활용해 보시기 바랍니다.
※ 함께 읽으면 도움이 될 만한 다른 포스팅 글입니다.
♥ 이 글이 도움이 되었기를 바랍니다. ^-^
댓글로 흔적을 남겨 주세요.