O operador UNION combina os resultados de duas ou mais queries em um único result set, retornando todas as linhas pertencentes a todas as queries envolvidas na execução. Para utilizar o UNION, o número e a ordem das colunas precisam ser idênticos em todas as queries e os data types precisam ser compatíveis.

Existem dois tipos de operador UNION, sendo eles UNION e UNION ALL.

UNION

O operador UNION, por default, executa o equivalente a um SELECT DISTINCT no result set final. Em outras palavras, ele combina o resultado de execução das duas queries e então executa um SELECT DISTINCT a fim de eliminar as linhas duplicadas. Este processo é executado mesmo que não hajam registros duplicados.

Exemplo:

SELECT ShipName, ShipAddress from Orders WHERE CustomerID ="WARTH" UNION SELECT ShipName, ShipAddress from Orders WHERE CustomerID ="VINET"

Resultado:


    ShipName                                        ShipAddress 
    ---------------------------------------- -------------------
    Vins et alcools Chevalier                     59 rue de l"Abbaye
    Wartian Herkku                                  Torikatu 38

UNION ALL

O operador UNION ALL tem a mesma funcionalidade do UNION, porém, não executa o SELECT DISTINCT no result set final e apresenta todas as linhas, inclusive as linhas duplicadas.

Exemplo:

SELECT ShipName, ShipAddress from Orders WHERE CustomerID ="WARTH"

UNION ALL

SELECT ShipName, ShipAddress from Orders WHERE CustomerID ="VINET"

Resultado:


    ShipName                                 ShipAddress      
    
    -------------------------------- ------------------
    
    Wartian Herkku                           Torikatu 38
    
    Wartian Herkku                           Torikatu 38
    
    Wartian Herkku                           Torikatu 38
    
    Vins et alcools Chevalier              59 rue de l"Abbaye
    
    Vins et alcools Chevalier              59 rue de l"Abbaye
    
    Vins et alcools Chevalier              59 rue de l"Abbaye
    
    Vins et alcools Chevalier              59 rue de l"Abbaye
    
    Vins et alcools Chevalier              59 rue de l"Abbaye

RECOMENDAÇÕES

1) Se não existe a possibilidade de haver registros duplicados em suas tabelas ou se não houver problemas para a aplicação que o record set final apresente duplicações, utilize o operador UNION ALL. A vantagem é que este operador não executa a função SELECT DISTINCT, utiliza menos recursos do SQL Server e como consequência, melhora a performance da aplicação.

2) Não utilize o operador UNION em conjunto com a função SELECT DISTINCT pois o resultado final será exatamente o mesmo, porém, o SQL Server estará executando a mesma operação duas vezes, causando queda de desempenho.

SELECT ShipName, ShipAddress from Orders WHERE CustomerID ="WARTH" 
    UNION 
    SELECT DISTINCT ShipName, ShipAddress from Orders WHERE CustomerID ="VINET"

Resultado:


    ShipName                                 ShipAddress        
    ---------------------------------------- -------------------
    Vins et alcools Chevalier                59 rue de l"Abbaye
    Wartian Herkku                           Torikatu 38

3) Uma query com uma ou mais cláusula OR pode ser reescrita utilizando o operador UNION ALL:

SELECT employeeID, firstname, lastname
    FROM names
    WHERE dept = "prod" or city = "Orlando" or division = "food"

A consulta acima possui três condições separadas na cláusula WHERE. Sendo assim, para que esta query utilize um indice, as três colunas referenciadas (dept, city e division) deverão fazer parte do índice. Esta query pode ser reescrita utilizando-se o operador UNION ALL:

SELECT employeeID, firstname, lastname FROM names WHERE dept = "prod"
    UNION ALLSELECT employeeID, firstname, lastname FROM names WHERE city = "Orlando"
    UNION ALL
    SELECT employeeID, firstname, lastname FROM names WHERE division = "food"

As duas consultas irão produzir o mesmo resultado. No entanto, se houver um índice na coluna dept mas não houver nas outras colunas referenciadas na cláusula WHERE, a primeira versão não utilizará o índice e será feito um Table Scan na tabela. Na segunda versão, o índice será utilizado em parte da query, melhorando significativamente resultado final.

Para mais informações sobre UNION ou UNION ALL, consulte o Books Online do SQL Server 2000.