UNION 절
UNION 절
UNION은 UNION ALL 또는 UNION DISTINCT를 명시적으로 지정해서 사용할 수 있어요. ALL이나 DISTINCT를 지정하지 않으면 union_default_mode 설정에 따라 동작이 달라져요. UNION ALL과 UNION DISTINCT의 차이는, UNION DISTINCT가 union 결과에 대해 distinct 변환을 수행한다는 점이에요. 이는 UNION ALL이 포함된 서브쿼리에 SELECT DISTINCT를 적용한 것과 동일해요.
출처: 문서
본문
UNION은 UNION ALL 또는 UNION DISTINCT를 명시적으로 지정해서 사용할 수 있어요. ALL이나 DISTINCT를 지정하지 않으면 union_default_mode 설정에 따라 동작이 결정돼요. UNION ALL과 UNION DISTINCT의 차이는, UNION DISTINCT가 union 결과에 대해 distinct 변환을 수행한다는 점이에요. 이는 UNION ALL이 포함된 서브쿼리에 SELECT DISTINCT를 적용한 것과 동등해요.
UNION은 임의 개수의 SELECT 쿼리를 결과를 이어 붙여 결합할 수 있어요. 예:
Query (쿼리)
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 BY와 LIMIT는 최종 결과가 아니라 각각의 쿼리에 적용돼요. 최종 결과에 변환을 적용해야 한다면, UNION이 있는 쿼리들을 FROM 절의 서브쿼리 안에 넣으면 돼요. UNION ALL이나 UNION DISTINCT를 명시하지 않고 UNION을 사용한다면, union_default_mode 설정으로 union 모드를 지정할 수 있어요. 설정 값은 ALL, DISTINCT 또는 빈 문자열이 될 수 있어요. 다만 union_default_mode 설정을 빈 문자열로 두고 UNION을 사용하면 예외가 발생해요. 다음 예시들은 설정 값이 다른 쿼리의 결과를 보여줘요.
Query (쿼리)
SET union_default_mode = 'DISTINCT';
SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 2;
Response (응답)
┌─1─┐
│ 1 │
└───┘
┌─1─┐
│ 2 │
└───┘
┌─1─┐
│ 3 │
└───┘
Query (쿼리)
SET union_default_mode = 'ALL';
SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 2;
Response (응답)
┌─1─┐
│ 1 │
└───┘
┌─1─┐
│ 2 │
└───┘
┌─1─┐
│ 2 │
└───┘
┌─1─┐
│ 3 │
└───┘
UNION/UNION ALL/UNION DISTINCT의 일부인 쿼리는 동시에 실행될 수 있고, 그 결과는 서로 섞일 수 있어요.
Syntax (구문)
SELECT ... UNION [ALL | DISTINCT] SELECT ... [UNION [ALL | DISTINCT] SELECT ...]
Part of (구성 요소): SELECT