<?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>Silvio Delgado  &#187; SQL</title>
	<atom:link href="http://www.silviodelgado.com.br/tag/sql/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.silviodelgado.com.br</link>
	<description>ASP.NET, MVC, C#, Design Patterns, jQuery, CSS, Webstandards, SEO et cetera</description>
	<lastBuildDate>Thu, 15 Dec 2011 04:37:29 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3</generator>
		<item>
		<title>INNER JOIN x LEFT OUTER JOIN</title>
		<link>http://www.silviodelgado.com.br/inner-join-x-left-outer-join/</link>
		<comments>http://www.silviodelgado.com.br/inner-join-x-left-outer-join/#comments</comments>
		<pubDate>Sun, 30 Sep 2007 03:49:43 +0000</pubDate>
		<dc:creator>Silvio Delgado</dc:creator>
				<category><![CDATA[Assuntos Diversos]]></category>
		<category><![CDATA[banco de dados]]></category>
		<category><![CDATA[SQL]]></category>
		<category><![CDATA[técnicas]]></category>

		<guid isPermaLink="false">http://www.silviodelgado.com.br/post.php?id=46</guid>
		<description><![CDATA[Banco de dados é uma coisa simples&#8230; quando se quer fazer coisas simples! Às vezes, mesmo para se fazer uma coisa simples, é necessário um procedimento um pouco mais rebuscado. Já para fazer uma coisa complicada&#8230; O que eu quero fazer não é complicado, mas como eu nunca trabalhei com os INNER, LEFT, RIGHT, OUTER [...]]]></description>
			<content:encoded><![CDATA[<p>Banco de dados é uma coisa simples&#8230; quando se quer fazer coisas simples!</p>
<p>Às vezes, mesmo para se fazer uma coisa simples, é necessário um procedimento um pouco mais rebuscado. Já para fazer uma coisa complicada&#8230;</p>
<p>O que eu quero fazer não é complicado, mas como eu nunca trabalhei com os INNER, LEFT, RIGHT, OUTER etc., não foi tão trivial assim.</p>
<p><span id="more-50"></span></p>
<p>Estou desenvolvendo um pequeno sistema de cobrança (sim, em PHP mesmo!) onde, na listagem de clientes, entre outras coisas, é exibida a cidade e uf a que pertencem.</p>
<p>Até aí, tudo bem! Nada demais. Fiz um JOIN simples:</p>
<p><code>SELECT cli.*, cid.nome AS nome_cidade, cid.uf<br />
FROM clientes AS cli, cidades AS cid<br />
WHERE cid.id_cidade = cli.cidade</code></p>
<p>O problema é que, da forma como foi feita, a frase só me retorna os clientes cujo campo cidade esteja preenchido com um valor que conste na tabela cidades. Valores nulos ou inexistentes não retornam os registros.</p>
<p>Uma &#8220;solução&#8221; (ou seria bacalhau?? [1]) para isso seria não permitir a deleção da cidade na sua tabela, mas isso acaba nos limitando, por diversos motivos.</p>
<p>Eu nunca fiz um JOIN que me retornasse registros desta forma (com os correspondentes nulos ou inexistentes), mas chegara a hora de ter de fazê-lo.</p>
<p>Pesquisando um pouco (foi pouco mesmo!), descobri como fazer um JOIN que me retornasse o que a query acima me retorna:</p>
<p><code>SELECT * FROM clientes AS cli<br />
INNER JOIN cidades AS cid ON cli.cidade = cid.id_cidade</code></p>
<p>Bom, até aí, tudo bem! Mas não resolveria o meu problema&#8230;</p>
<p>Lembrando um pouco do que eu já tinha lido sobre o tema, vi o &#8220;INNER&#8221; na frase e lembrei do seu &#8220;oposto&#8221;: &#8220;LEFT OUTER&#8221;, que mantém os registros. Logo cheguei à seguinte formulação:</p>
<p><code>SELECT * FROM clientes AS cli<br />
LEFT OUTER JOIN cidades AS cid ON cli.cidade = cid.id_cidade</code></p>
<p>Ei-lo como qui-lo! (Ou quase&#8230;)</p>
<p>A sentença me retornou todos os campos da tabela de clientes, inclusive aquele registro que tinha o cídogi inválido para a cidade. Agora só faltava manipular os nomes dos campos, por causa da duplicidade (nome do cliente x nome da cidade):</p>
<p><code>SELECT cli.*, cid.nome AS nome_cidade, cid.uf<br />
FROM clientes AS cli<br />
LEFT OUTER JOIN cidades AS cid ON cli.cidade = cid.id_cidade</code></p>
<p>Pronto! Estava resolvido o meu problema. E espero que o seu agora também esteja. <img src='http://www.silviodelgado.com.br/blog/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p>Até a próxima!</p>
<p>[1] &#8211; O termo provém do antigo ditado que dizia &#8220;pra quem é, bacalhau serve&#8221;, que era um eufemismo para dizer que, para uma pessoa sem muita importância, uma coisa mal-feita já estava bom. Mas isso era no tempo em que bacalhau e manjubinha disputavam clientes no boteco&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.silviodelgado.com.br/inner-join-x-left-outer-join/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

