Desenvolvimento - SQLFeed de artigos deste autor

SQL: Utilizando o Operador UNION e UNION ALL

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.

por Nilton Pinheiro



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 Chevalier59 rue de l"Abbaye

Vins et alcools Chevalier59 rue de l"Abbaye

Vins et alcools Chevalier59 rue de l"Abbaye

Vins et alcools Chevalier59 rue de l"Abbaye

Vins et alcools Chevalier59 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 ALL
SELECT 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.

Nilton Pinheiro

Nilton Pinheiro - Graduado em Análise de Sistemas e possui pós-graduação em Redes Corporativas. Trabalhou vários anos como desenvolvedor em Microsoft Access e Visual Basic. Posteriormente trabalhou também como Adminstrador de Redes em uma Solution Provider Microsoft.
A 6 anos trabalhando com SQL Server, a 5 trabalha como DBA em uma conceituada instituição financeira em São Paulo. Seu foco está na admimistração de servidores corporativos sendo 90% deles, instalação em cluster Ativo/Ativo. Nilton é um Beta Tester Microsoft e está trabalhando em laboratório com o SQL Server 2005 desde seu Beta1, também é um Microsoft Certified Professional, Microsoft Certified Systems Engineer e Microsoft Certified Database Administrator.
Administrador do site MCDBA Brasil (
http://www.mcdbabrasil.com.br/).