Treinamento para consultas com SQL Server - Parte 4 - UNION

Esta palavra chave (ou operador) é usada quando se deseja unir resultados de consultas diferentes em um mesmo conjunto de linhas (resultset ou rowset). É possível usar tanto repetindo os resultados que estão em duas ou mais consultas unidas como, fazendo com que apareçam apenas os resultados que não estão repetidos.

Com UNION se consegue reunir o resultado duas ou mais consultas havendo, porém, algumas restrições:

  1. O número das colunas retornadas deve ser o mesmo em todas as tabelas
  2. O tipo das colunas também deve ser o mesmo em todas as consultas
  3. A cláusula ORDER BY só poderá ser colocada ao final de todas as consultas, não sendo possível usar em cada consulta individualmente.

Union com repetição de resultados

Se for usada somente a cláusula UNION os resultados que forem comuns em todas as consultas serão repetidos. Considere a tabela PERSON.PERSON, na consulta abaixo são listados os nomes dos registros para quando se tem uma pessoa de contato informada e se possui dados de cartão de crédito. As tabelas desta consulta estão exibidas no diagrama da figura abaixo.

A consulta fica como está descrito abaixo.

-- Pessoas com contatos
select TOP 5 p.FirstName + ' ' + p.LastName as CompleteName
from person.person p
where exists (
 select BusinessEntityID bec
 from person.BusinessEntityContact bec
 where bec.PersonID = p.BusinessEntityID
 )

UNION 

-- Pessoas com cartão de crédito
select TOP 5 p.FirstName + ' ' + p.LastName as CompleteName
from person.person p
where exists (
 SELECT pc.BusinessEntityId
 from sales.PersonCreditCard pc
 where pc.BusinessEntityID = p.BusinessEntityID
 )

ORDER BY CompleteName
 

O resultado que é exibido na próxima figura, mostra que não foram repetidos nomes, ou seja, se algum dos nomes possuir endereço e cartão de crédito, somente será listado uma vez.

Caso seja necessário repetir os resultados para ambas as consultas (e, se houvessem mais do que duas, para cada consulta definida), basta colocar o termo ALL como na consulta que segue demonstrada.

-- UNION ALL
select TOP 5 p.FirstName + ' ' + p.LastName as CompleteName
from person.person p
where exists (
 select BusinessEntityID bec
 from person.BusinessEntityContact bec
 where bec.PersonID = p.BusinessEntityID
 )

UNION ALL

select TOP 5 p.FirstName + ' ' + p.LastName as CompleteName
from person.person p
where exists (
 SELECT pc.BusinessEntityId
 from sales.PersonCreditCard pc
 where pc.BusinessEntityID = p.BusinessEntityID
 )

ORDER BY CompleteName
 

Pode se perceber que alguns nomes são repetidos por estarem presentes nas duas consultas. Veja o resultado na próxima figura.

Para conhecer um pouco mais sobre o assunto, recomendo a leitura da documentação oficial da Microsoft que tem exemplos e outros links relacionados. Bons estudos!