<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Dia a dia Oracle &#187; union all</title>
	<atom:link href="http://www.diaadiaoracle.com.br/category/union-all/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.diaadiaoracle.com.br</link>
	<description></description>
	<lastBuildDate>Mon, 01 Aug 2011 22:36:23 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>Union x Union ALL &#8212; Select&#8217;s no Oracle</title>
		<link>http://www.diaadiaoracle.com.br/2009/04/16/union-x-union-all-selects-no-oracle/</link>
		<comments>http://www.diaadiaoracle.com.br/2009/04/16/union-x-union-all-selects-no-oracle/#comments</comments>
		<pubDate>Thu, 16 Apr 2009 16:46:00 +0000</pubDate>
		<dc:creator>oracle</dc:creator>
				<category><![CDATA[distinct]]></category>
		<category><![CDATA[oracle]]></category>
		<category><![CDATA[query]]></category>
		<category><![CDATA[select]]></category>
		<category><![CDATA[union]]></category>
		<category><![CDATA[union all]]></category>

		<guid isPermaLink="false">http://www.diaadiaoracle.com.br/?p=7</guid>
		<description><![CDATA[Fala PessoAll, Vamos com mais uma dica interessante sobre Oracle. 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&#8217;s. Que? Entendeu nada!? Vamos lá: Existe no Oracle a possibilidade de unirmos [...]]]></description>
			<content:encoded><![CDATA[<p>Fala PessoAll,</p>
<p>Vamos com mais uma dica interessante sobre Oracle.<br />
Vamos analisar desta vez, os comandos <code>UNION</code> e <code>UNION ALL</code>. Estes comandos servem para que possamos unir mais de uma query (select) em um mesmo comando, trazendo os resultados de ambas as query&#8217;s. Que? Entendeu nada!? Vamos lá:</p>
<p>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?</p>
<p>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:</p>
<p><code><br />
Select codcli,<br />
nom_cli,<br />
'C' tipo<br />
from clientes<br />
union<br />
Select cod_func,<br />
nom_func,<br />
'F'<br />
from funcionarios;<br />
</code></p>
<p>Se vocês executarem este comando, teremos todos os clientes e todos os funcionários listados em um mesmo resultado, mas&#8230; temos algumas coisas a considerar.</p>
<p>1 &#8211; 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.</p>
<p>2 &#8211; Quando usamos o comando <code>UNION</code>, temos obrigatóriamente que ter a mesma quantidade de colunas e o mesmo tipo de dados das colunas em todas as query&#8217;s. Como assim? Suponha que na tabela <code>clientes</code> a coluna <code>cod_cli</code> tenha tipo de dados <code>number</code> e na tabela <code>funcionarios</code> a coluna <code>cod_func</code> tenha tipo de dados <code>varchar2</code>, não pode! Ao executar este comando o banco vai retornar um erro dizendo que as colunas das query&#8217;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.</p>
<p>3 &#8211; Não podemos utilizar <code>ORDER BY</code> nas query&#8217;s envolvidas, apenas na última query, que ordernará os registros de todas as query&#8217;s. Neste caso acima, por exemplo, se na ultima query colocássemos um <code>ORDER BY 1</code> por exemplo, ele ordenaria o resultado das duas query&#8217;s juntas, como se fosse um comando só. Se tiver códigos iguais nas duas query&#8217;s, serão trazidos juntos, pois os resultados serão considerados juntos na hora de ordenar.</p>
<p>Outra coisa que comentei no início foi o <code>UNION ALL</code>, qual a diferença dele pro <code>UNION</code>? O <code>UNION</code> utilizado sozinho faz um <code>distinct</code> 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 <code>UNION ALL</code>, independente da quantidade de registros repetidos que sejam retornados, todos serão exibidos.</p>
<p>Como usa? Assim:</p>
<p><code><br />
Select codcli,<br />
nom_cli,<br />
'C' tipo<br />
from clientes<br />
union all<br />
Select cod_func,<br />
nom_func,<br />
'F'<br />
from funcionarios;<br />
</code></p>
<p>Qual a diferença? Só o <code>all</code> depois do <code>union</code>, depois disso o resto o Oracle resolve. Espero esse tal de Oracle!!</p>
<p>Momento DBA: Para o banco, por não precisar se preocupar em verificar se existem resultados iguais para que exiba apenas um deles, o <code>UNION ALL</code> tem bem menos custo para ser executado, portanto, se você tiver query&#8217;s em que você tem certeza que não serão retornados valores repetidos (como essa do exemplo, em que temos uma coluna <code>tipo</code> para diferenciar) use sempre <code>UNION ALL</code>, seu DBA e seu Banco de Dados agradecem!</p>
<p>É isso pessoal, espero que tenham entendido e que gostem.<br />
Qualquer dúvida, sugestão, reclamação etc não deixem de entrar em contato.</p>
<p>Atc.<br />
Gerson Júnior<br />
gerson.vasconcelos@gmail.com</p>
]]></content:encoded>
			<wfw:commentRss>http://www.diaadiaoracle.com.br/2009/04/16/union-x-union-all-selects-no-oracle/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>

