Desenvolvimento - SQL
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 PinheiroExistem 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.
- Diferenças entre SEQUENCES x IDENTITY no Microsoft SQL Server 2012SQL
- Utilizando FILETABLE no SQL Server 2012SQL Server
- Utilizando SEQUENCES no Microsoft SQL Server 2012SQL
- Exportação de dados do SQL Server para o Oracle com assistente de importação do SQL ServerSQL
- Tunning Index com o DTASQL






