Jump to content

Archived

This topic is now archived and is closed to further replies.

eriva_br

Operador UNION e UNION ALL

Recommended Posts

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's que 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.

Share this post


Link to post
Share on other sites

Olá gostaria gostaria de saber como eu vejo no resultado da busca por union a tabela que é o registro para eu poder fazer um update ou acessar o cadastro.Obrigado

de forma automática não conheço, mas tu pode criar manualmente um campo de origem para posterior identificação, exemplo:
select 'tabela de Cliente' as origem, nome from @tbClientes		union		select 'tabela de Fornecedores' as origem, nome from @tbFornecedores	   order by nome

Share this post


Link to post
Share on other sites

Olá gostaria gostaria de saber como eu vejo no resultado da busca por union a tabela que é o registro para eu poder fazer um update ou acessar o cadastro.Obrigado

de forma automática não conheço, mas tu pode criar manualmente um campo de origem para posterior identificação, exemplo:
select 'tabela de Cliente' as origem, nome from @tbClientes		union		select 'tabela de Fornecedores' as origem, nome from @tbFornecedores	   order by nome
Valeu cara e eu estava pensando nessa lógica por ser uma tabela virtual, mas ai eu tinha colocado tabela_de_cliente as origem e por já estar meio cansado nao coloquei entre aspas por isso nao deu certo.Valeu ai

Share this post


Link to post
Share on other sites

×

Important Information

Ao usar o fórum, você concorda com nossos Terms of Use.