domingo, 26 de agosto de 2012

Operador UNION e UNION ALL - união de queries

Operador UNION
união de query's, juntar, unir, atrelar, conectar, ligar, acoplar, vincular... várias queries em um único resultado, juntando o select num moido só...


Descrição:
Este operador possibilita a combinação de uma ou mais queries em um único resultado consistindo todas as linhas pertencentes a todas as querys neste união. Veja que isto é diferente de usar JOIN'sque combinam colunas de diferentes tabelas

Regras:
Duas regras básicas para o uso do UNION
- O número e a ordem das colunas deve ser identico em todas as queries
- O tipo de dados deve ser compativel, caso náo for, uma dica seria converter tudo pra varchar usando a função convert

Opções:
Temos a opção de definir a união total com UNION ALL ou somente a união simples com UNION, vejamos abaixo as diferenças:
- UNION: faz a união e já elimina linhas idênticas
- UNION ALL: faz a união e mantém as linhas idênticas
No exemplo abaixo veremos melhor esta a diferença.

Exemplo:
Vamos fazer a união das tabelas clientes e fornecedores, somente com o campo 'Nome', note que o registro "Vito Corleone" (ele mesmo Don Vito, o poderoso Chefão), aparece na tabela de clientes e fornecedores, logo em UNION ele vai aparecer uma única vez e em UNION ALL ele vai aparecer duas vezes.

tabelas para testes
--configurando para não aparecer o contador de registros executados 
set nocount on
--declarando tabelas temporarias para teste
declare @tbClientes table (cod int identity, nome varchar(30))
declare @tbFornecedores table (cod int identity, nome varchar(30))
                  
--inserindo dados na tabela clientes
insert into @tbClientes (nome) values ('Vito Corleone')
insert into @tbClientes (nome) values ('Bonasera')
insert into @tbClientes (nome) values ('Luca Brasi')
                  
--inserindo dados na tabela fornecedores
insert into @tbFornecedores (nome) values ('Paul Vitti')
insert into @tbFornecedores (nome) values ('Tonny Gordo')
insert into @tbFornecedores (nome) values ('Vito Corleone')

.
.
.
.

UNION
--executando o UNION 
select nome from @tbClientes
union
select nome from @tbFornecedores
order by nome
Resultado, observe que Vito Corleone aparece apenas uma única vez:
nome
------------------------------
Bonasera
Luca Brasi
Paul Vitti
Tonny Gordo
Vito Corleone

.
.
.
.
UNION ALL

--executando o UNION ALL
select nome from @tbClientes
union all
select nome from @tbFornecedores
order by nome

Resultado, observe que Vito Corleone aparece duas vezes:
nome
------------------------------
Bonasera
Luca Brasi
Paul Vitti
Tonny Gordo
Vito Corleone
Vito Corleone


OBS:
- Para a ordenação o comando ORDER BY tem que ficar após o último SELECT
- No exemplo citado para as construções UNION foram usadas duas query's, mas poderiamos ter usado N query's


AUTOR: "eriva_br"
Dúvidas, criticas, contribuições, correções e adições seram bem vindas. 

Nenhum comentário:

Postar um comentário