Vamos analisar desta vez, os comandos UNION e UNION ALL. Estes comandos servem para que possamos unir mais de uma query (select) em um mesmo comando, trazendo os resultados de ambas as query’s. Que? Entendeu nada!? Vamos lá:

Existe no Oracle a possibilidade de unirmos mais de um comando select de forma que possamos obter o resultados de todos eles unidos (claro!) em um único resultado, como se fosse um comando só, como assim?

Suponha que você possui uma tabela de clientes e uma tabela de funcionários, e você quer trazer todos os códigos e nomes de clientes e funcionários para exibir em um relatório? Como fazer isso? Assim:


Select codcli,
nom_cli,
'C' tipo
from clientes
union
Select cod_func,
nom_func,
'F'
from funcionarios;

Se vocês executarem este comando, teremos todos os clientes e todos os funcionários listados em um mesmo resultado, mas… temos algumas coisas a considerar.

1 – Vocês devem ter notado que os nomes das colunas das tabelas são diferentes, quando eu rodar que nome minha coluna vai ter? O nome das colunas da primeira query da lista de comandos, a primeira query vai mandar em tudo e as colunas do resultado vão receber o nome das colunas da primeira query.

2 – Quando usamos o comando UNION, temos obrigatóriamente que ter a mesma quantidade de colunas e o mesmo tipo de dados das colunas em todas as query’s. Como assim? Suponha que na tabela clientes a coluna cod_cli tenha tipo de dados number e na tabela funcionarios a coluna cod_func tenha tipo de dados varchar2, não pode! Ao executar este comando o banco vai retornar um erro dizendo que as colunas das query’s não estão corretamente relacionadas. Como em ambos os comandos elas são a primeira coluna da query e estarão relacionadas, ambas tem que ter o mesmo tipo.

3 – Não podemos utilizar ORDER BY nas query’s envolvidas, apenas na última query, que ordernará os registros de todas as query’s. Neste caso acima, por exemplo, se na ultima query colocássemos um ORDER BY 1 por exemplo, ele ordenaria o resultado das duas query’s juntas, como se fosse um comando só. Se tiver códigos iguais nas duas query’s, serão trazidos juntos, pois os resultados serão considerados juntos na hora de ordenar.

Outra coisa que comentei no início foi o UNION ALL, qual a diferença dele pro UNION? O UNION utilizado sozinho faz um distinct no resultado da query, ou seja, se tiverem resultados repitidos eles não serão exibidos, será exibida apenas uma ocorrência. Suponha que por coincidência tenhamos um cliente com código 1 e nome CICERO e tenhamos um funcionario com código 1 e nome CICERO também, caso não tivéssemos essa coluna tipo para diferenciar os registros de clientes e funcionários teríamos a ocorrência 1 CICERO apenas uma vez em nosso resultado. Já usando o UNION ALL, independente da quantidade de registros repetidos que sejam retornados, todos serão exibidos.

Como usa? Assim:


Select codcli,
nom_cli,
'C' tipo
from clientes
union all
Select cod_func,
nom_func,
'F'
from funcionarios;

Qual a diferença? Só o all depois do union, depois disso o resto o Oracle resolve. Espero esse tal de Oracle!!

Momento DBA: Para o banco, por não precisar se preocupar em verificar se existem resultados iguais para que exiba apenas um deles, o UNION ALL tem bem menos custo para ser executado, portanto, se você tiver query’s em que você tem certeza que não serão retornados valores repetidos (como essa do exemplo, em que temos uma coluna tipo para diferenciar) use sempre UNION ALL, seu DBA e seu Banco de Dados agradecem!

Technorati Marcas: ,,,