본문으로 바로가기
본문으로 바로가기

UNION 절

UNION ALL 또는 UNION DISTINCT를 명시적으로 지정하여 UNION을 사용할 수 있습니다.

ALL 또는 DISTINCT를 지정하지 않으면 union_default_mode 설정에 따라 동작이 달라집니다. UNION ALLUNION DISTINCT의 차이점은 UNION DISTINCT가 UNION 결과 집합에 대해 중복 제거를 수행한다는 점이며, 이는 UNION ALL이 포함된 서브쿼리에 대해 SELECT DISTINCT를 수행하는 것과 동일합니다.

UNION을 사용하여 결과를 확장하는 방식으로 임의 개수의 SELECT 쿼리를 결합할 수 있습니다. 예:

SELECT CounterID, 1 AS table, toInt64(count()) AS c
    FROM test.hits
    GROUP BY CounterID

UNION ALL

SELECT CounterID, 2 AS table, sum(Sign) AS c
    FROM test.visits
    GROUP BY CounterID
    HAVING c > 0

결과 컬럼은 인덱스(SELECT 안에서의 순서)로 매칭됩니다. 컬럼 이름이 일치하지 않으면 최종 결과의 컬럼 이름은 첫 번째 쿼리에서 가져옵니다.

UNION 실행 시 타입 캐스팅이 수행됩니다. 예를 들어, 결합되는 두 쿼리에 동일한 필드가 있고, 해당 필드의 타입이 호환 가능한 타입에서 각각 Nullable이 아닌 타입과 Nullable 타입으로 정의되어 있는 경우, 결과 UNION에는 Nullable 타입 필드가 사용됩니다.

UNION을 구성하는 쿼리는 소괄호로 감쌀 수 있습니다. ORDER BYLIMIT은 최종 결과가 아니라 개별 쿼리에 적용됩니다. 최종 결과에 변환을 적용해야 하는 경우, UNION이 포함된 모든 쿼리를 FROM 절의 서브쿼리 안에 넣으면 됩니다.

UNION ALL 또는 UNION DISTINCT를 명시적으로 지정하지 않고 UNION을 사용하는 경우, union_default_mode 설정을 사용하여 유니온 모드를 지정할 수 있습니다. 해당 설정 값은 ALL, DISTINCT 또는 빈 문자열이 될 수 있습니다. 그러나 UNION을 사용할 때 union_default_mode 설정을 빈 문자열로 지정하면 예외가 발생합니다. 다음 예시는 설정 값이 서로 다른 경우 쿼리 결과가 어떻게 달라지는지 보여줍니다.

쿼리:

SET union_default_mode = 'DISTINCT';
SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 2;

결과:

┌─1─┐
│ 1 │
└───┘
┌─1─┐
│ 2 │
└───┘
┌─1─┐
│ 3 │
└───┘

쿼리:

SET union_default_mode = 'ALL';
SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 2;

결과:

┌─1─┐
│ 1 │
└───┘
┌─1─┐
│ 2 │
└───┘
┌─1─┐
│ 2 │
└───┘
┌─1─┐
│ 3 │
└───┘

UNION/UNION ALL/UNION DISTINCT를 구성하는 각 쿼리는 동시에 실행될 수 있으며, 그 결과는 하나로 병합됩니다.

함께 보기