본문 바로가기
IT정보

오라클 UNION과 UNION ALL의 차이

by 디노프랭키 2023. 5. 5.
728x90

UNION과 UNION ALL이란?

UNION과 UNION ALL은 두 개 이상의 조회 결과를 하나로 합치는 연산자입니다. 두 연산자의 차이점은 중복 데이터를 포함하는지입니다. UNION의 경우 두 개 이상의 조회 결과에서 중복 행을 제외하고 데이터를 출력합니다. UNION ALL은 조회결과에서 중복 행을 제거하지 않고 데이터를 출력합니다.

왜 UNION을 사용해야 하는가?

데이터 중복을 제거하는 경우

두 개 이상의 조회 결과에서 데이터 행의 중복을 제거해야 하는 경우 UNION을 사용하면 손쉽게 제거 할 수 있습니다.

-- 테이블 데이이터 설정
--    TBL_A                           TBL_B
USER_NO   USER_NAME             USER_NO   USER_NAME
---------------------          ---------------------
  10        이지훈                 20       가지현          
  20        가지현                 40       주성치
  30        여인설                 50       홍은 
  
-- 조회  
SELECT USER_NO, USER_NAME FROM TBL_A 
UNION
SELECT USER_NO, USER_NAME FROM TBL_B;

--결과
USER_NO   USER_NAME
---------------------
  10        이지훈
  20        가지현                 
  30        여인설
  40        주성치
  50         홍은

가상의 테이블을 만드는 경우

-- 조회
SELECT *
  FROM (
    SELECT 'A' AS CODE, 'A등급' AS CODE_NAME, 90 AS SCORE FROM DUAL UNION ALL
    SELECT 'B' AS CODE, 'B등급' AS CODE_NAME, 80 AS SCORE FROM DUAL UNION ALL
    SELECT 'C' AS CODE, 'C등급' AS CODE_NAME, 70 AS SCORE FROM DUAL UNION ALL
    SELECT 'D' AS CODE, 'D등급' AS CODE_NAME, 60 AS SCORE FROM DUAL
  ) A
  
-- 결과 
  CODE    CODE_NAME   SCORE
------------------------------
  A         A등급       90
  B         B등급       80
  C         C등급       70
  D         D등급       60

UNION과 UNION ALL의 사용방법

SELECT COL1, COL2 ....
  FROM 테이블명1
 UNION [ALL]
SELECT COL1M, COL2 ....
  FROM 테이블명2

UNION으로 사용하는 경우 ALL 명령어는 제외시킬 수 있습니다. UNION과 UNION ALL 사용 시 합치고자 하는 두 개 조회 쿼리의 칼럼 개수와 칼럼 타입이 동일해야 합니다. 칼럼 개수가 다를 경우 "질의 블록은 부정확한 수의 결과 열을 가지고 있습니다" 칼럼 타입이 다를 경우 "대응하는 식과 같은 데이터 유형이어야 합니다"의 오류 메시지가 출력됩니다.

UNION 시 컬럼 개수 및 데이터 유형이 다른 컬럼 찾기

칼럼이 10개 내외면 눈으로 확인해도 쉽게 찾을 수 있습니다. 하지만 대량의 데이터를 사용하는 테이블이나 칼럼 개수가 너무 많은 쿼리의 경우 눈으로 찾기 여간 어려운 일이 아닐 수 없습니다. 데이터 유형은 가상의 컬럼들도 존재하기 때문에 더 찾기 힘듭니다. 이런 경우 조금의 꼼수로 쉽게 찾을 수 있는 방법을 알려드리겠습니다.

-- 첫번째 쿼리의 조회 구조만 테이블로 만듭니다.
CREATE TABLE TBL_TMP1
SELECT COL1, COL2, COL3, COL4 .... COL50
  FORM TBL1
 WHERE 1 = 2;
 
 -- 두번째 쿼리의 조회 구조만 테이블로 만듭니다.
CREATE TABLE TBL_TMP2
SELECT COL1, COL2, COL3, COL4 .... COL50
  FORM TBL2
 WHERE 1 = 2;

 -- 테이블의 구조를 비교합니다. NULL로 표시되는 쪽이 매칭이 되지 않는 행입니다.
SELECT A.TABLE_NAME, A.COLUMN_NAME, A.DATA_TYPE, A.DATA_LENGTH, A.DATA_PRECISION
     , B.TABLE_NAME, B.COLUMN_NAME, B.DATA_TYPE, B.DATA_LENGTH, B.DATA_PRECISION
  FROM (
    SELECT *
      FROM DBA_TAB_COLUMNS
     WHERE OWNER = 'TEST'
       AND TABLE_NAME = 'TBL1'
   ) A
   FULL OUTER JOIN
   (
     SELECT *
      FROM DBA_TAB_COLUMNS
     WHERE OWNER = 'TEST'
     AND TABLE_NAME = 'TBL2'
   ) B
 ON A.TABLE_NAME = B.TABLE_NAME
AND A.COLUMN_NAME = B.COLUMN_NAME
AND A.DATA_TYPE = B.DATA_TYPE;

-- TEMP테이블을 삭제합니다.
DROP TABLE TBL_TMP1;
DROP TABLE TBL_TMP2;

임시로 테이블을 생성 시 컬럼 타입은 특정 테이블의 컬럼으로 조회를 한 경우 해당 컬럼의 타입이 지정되고 가상의 만들어진 컬럼의 경우 오라클에서 알아서 컬럼타입을 최대값으로 지정하게 됩니다. 눈으로 확인하는게 아니라 쿼리로 확인을 하니 더 정확한 결과를 빠르게 찾을 수 있습니다.

728x90

'IT정보' 카테고리의 다른 글

오라클 WITH 임시테이블  (27) 2023.05.09
오라클 KEEP  (9) 2023.05.07
오라클 동적 관리 뷰  (6) 2023.05.04
오라클 시스템 뷰 및 사용자 뷰  (2) 2023.05.03
시스템 뷰  (2) 2023.05.02

댓글