수색…


소개

SQL의 UNION 키워드는 중복이없는 SELECT 문 결과에 결합하는 데 사용됩니다. UNION을 사용하고 결과를 결합하려면 두 SELECT 문 모두 같은 순서로 동일한 데이터 유형의 열을 가져야하지만 열의 길이는 다를 수 있습니다.

통사론

  • SELECT column_1 [, column_2] FROM table_1 [, table_2] [WHERE 조건]
    UNION | UNION ALL
    SELECT column_1 [, column_2] FROM table_1 [, table_2] [WHERE 조건]

비고

UNIONUNION ALL 절은 두 개 이상의 동일하게 구성된 SELECT 문의 결과 세트를 단일 결과 / 테이블로 결합합니다.

UNION / UNION ALL 이 작동하려면 각 쿼리의 열 개수와 열 형식이 일치해야합니다.

UNIONUNION ALL 쿼리의 차이점은 UNION 절이 UNION ALL 이없는 결과에서 중복 행을 제거한다는 것입니다.

이와 같이 명확한 레코드 제거는 심지어 최적화 된 쿼리를 위해 항상 UNION ALL 을 기본값으로 두거나 상관하지 않을 것을 알게되면 제거 할 고유 한 행이 없더라도 쿼리를 상당히 느려질 수 있습니다.

기본 UNION ALL 쿼리

CREATE TABLE HR_EMPLOYEES
(
    PersonID int,
    LastName VARCHAR(30),
    FirstName VARCHAR(30),
    Position VARCHAR(30)
);

CREATE TABLE FINANCE_EMPLOYEES
(
    PersonID INT,
    LastName VARCHAR(30),
    FirstName VARCHAR(30),
    Position VARCHAR(30)
);

우리 부서에서 모든 managers 의 이름을 추출하려고한다고 가정 해 봅시다.

사용 UNION 우리가 보유 두 인사 및 재무 부서의 모든 직원 얻을 수있는 position (A)의 manager

SELECT 
    FirstName, LastName   
FROM 
    HR_EMPLOYEES  
WHERE 
    Position = 'manager'  
UNION ALL  
SELECT 
    FirstName, LastName  
FROM 
    FINANCE_EMPLOYEES  
WHERE 
    Position = 'manager'  

UNION 문은 쿼리 결과에서 중복 행을 제거합니다. 두 부서 모두에서 동일한 이름과 지위를 가진 사람들을 가질 수 있으므로 중복을 제거하지 않기 위해 UNION ALL 사용하고 있습니다.

각 출력 열에 별칭을 사용하려면 다음과 같이 첫 번째 select 문에 별칭을 추가하면됩니다.

SELECT 
    FirstName as 'First Name', LastName as 'Last Name'
FROM 
    HR_EMPLOYEES  
WHERE 
    Position = 'manager'  
UNION ALL  
SELECT 
    FirstName, LastName  
FROM 
    FINANCE_EMPLOYEES  
WHERE 
    Position = 'manager'  

간단한 설명과 예제

간단한 용어로 :

  • 결과 집합에서 중복을 제거하는 동안 UNION 2 개의 결과 집합을 조인합니다.
  • UNION ALL 중복을 제거하지 않고 2 개의 결과 세트를 결합합니다.

많은 사람들이 실수를 저지르는 한 가지 실수는 중복을 제거 할 필요가 없을 때 UNION 을 사용하는 것입니다. 대규모 결과 집합에 대한 추가 성능 비용은 매우 중요 할 수 있습니다.

UNION 이 필요한 경우

두 가지 다른 특성에 대해 테이블을 필터링해야하고 각 열에 대해 개별 클러스터되지 않은 인덱스를 작성했다고 가정합니다. UNION 사용하면 중복을 방지하면서 두 인덱스를 모두 활용할 수 있습니다.

SELECT C1, C2, C3 FROM Table1 WHERE C1 = @Param1
UNION
SELECT C1, C2, C3 FROM Table1 WHERE C2 = @Param2

이렇게하면 쿼리를 최적으로 수행하는 데 간단한 인덱스 만 있으면되기 때문에 성능 튜닝이 간단 해집니다. 클러스터되지 않은 인덱스가 상당히 적어서 원본 테이블에 대한 전체 쓰기 성능이 향상 될 수도 있습니다.

UNION ALL 이 필요한 경우

두 속성에 대해 테이블을 필터링해야하지만 중복 레코드를 필터링 할 필요가 없다고 가정하십시오 (데이터 모델 설계로 인해 데이터가 중복되지 않거나 데이터가 중복을 생성하지 않기 때문에).

SELECT C1 FROM Table1
UNION ALL
SELECT C1 FROM Table2

이것은 여러 테이블에 물리적으로 분할되도록 설계된 데이터를 결합하는 뷰를 생성 할 때 (성능상의 이유로, 레코드를 롤업하려는 경우) 특히 유용합니다. 데이터가 이미 분할되었으므로 데이터베이스 엔진에서 중복 제거를 수행하면 값이 추가되지 않고 쿼리에 추가 처리 시간이 추가됩니다.



Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow