<?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>Blog de CinéPhil &#187; Langage SQL</title>
	<atom:link href="https://blog.developpez.com/cinephil/pcategory/bases-de-donnees/langage-sql/feed" rel="self" type="application/rss+xml" />
	<link>https://blog.developpez.com/cinephil</link>
	<description>Ce qui se conçoit bien s&#039;énonce clairement...</description>
	<lastBuildDate>Tue, 11 Dec 2012 15:58:32 +0000</lastBuildDate>
	<language>fr-FR</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>https://wordpress.org/?v=4.1.42</generator>
	<item>
		<title>Jointure externe et condition de restriction.</title>
		<link>https://blog.developpez.com/cinephil/p9571/bases-de-donnees/langage-sql/jointure_externe_et_condition_de_restric</link>
		<comments>https://blog.developpez.com/cinephil/p9571/bases-de-donnees/langage-sql/jointure_externe_et_condition_de_restric#comments</comments>
		<pubDate>Fri, 10 Dec 2010 13:44:17 +0000</pubDate>
		<dc:creator><![CDATA[CinePhil]]></dc:creator>
				<category><![CDATA[Langage SQL]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Quand on fait une jointure externe à gauche et qu&#8217;on pose une restriction (dans le WHERE) sur la table de droite, c&#8217;est comme si on faisait une jointure interne ! Explication avec un exemple simple&#8230; Soit les tables suivantes : &#8230; <a href="https://blog.developpez.com/cinephil/p9571/bases-de-donnees/langage-sql/jointure_externe_et_condition_de_restric">Lire la suite <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>Quand on fait une jointure externe à gauche et qu&rsquo;on pose une restriction (dans le WHERE) sur la table de droite, c&rsquo;est comme si on faisait une jointure interne !</p>
<p>Explication avec un exemple simple&#8230;<br />
<span id="more-1"></span><br />
Soit les tables suivantes :<br />
Table A<br />
idA, valA<br />
1, &lsquo;toto&rsquo;<br />
2, &lsquo;titi&rsquo;<br />
3, &lsquo;tata&rsquo;</p>
<p>Table B<br />
idB, idA, valB, booleen<br />
1, 2, &lsquo;riri&rsquo;, 0<br />
2, 3, &lsquo;fifi&rsquo;, 1</p>
<p>Faisons une jointure externe à gauche sans condition :<br />
=> Code :</p>
<div class="codecolorer-container sql default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br /></div></td><td><div class="sql codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #993333; font-weight: bold;">SELECT</span> A<span style="color: #66cc66;">.</span>idA<span style="color: #66cc66;">,</span> A<span style="color: #66cc66;">.</span>valA<span style="color: #66cc66;">,</span> B<span style="color: #66cc66;">.</span>idB<span style="color: #66cc66;">,</span> B<span style="color: #66cc66;">.</span>valB<span style="color: #66cc66;">,</span> B<span style="color: #66cc66;">.</span>booleen <br />
<span style="color: #993333; font-weight: bold;">FROM</span> A <br />
<span style="color: #993333; font-weight: bold;">LEFT</span> <span style="color: #993333; font-weight: bold;">OUTER</span> <span style="color: #993333; font-weight: bold;">JOIN</span> B <span style="color: #993333; font-weight: bold;">ON</span> B<span style="color: #66cc66;">.</span>idA <span style="color: #66cc66;">=</span> A<span style="color: #66cc66;">.</span>idA</div></td></tr></tbody></table></div>
<p>=> Résultat :<br />
idA, valA, idB, valB, booleen<br />
1, &lsquo;toto&rsquo;, NULL, NULL, NULL<br />
2, &lsquo;titi&rsquo;, 1, &lsquo;riri&rsquo;, 0<br />
3, &lsquo;tata&rsquo;, 2, &lsquo;fifi&rsquo;, 1</p>
<p>Ajoutons une restriction dans le WHERE sur la table B :<br />
=> Code :</p>
<div class="codecolorer-container sql default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br /></div></td><td><div class="sql codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #993333; font-weight: bold;">SELECT</span> A<span style="color: #66cc66;">.</span>idA<span style="color: #66cc66;">,</span> A<span style="color: #66cc66;">.</span>valA<span style="color: #66cc66;">,</span> B<span style="color: #66cc66;">.</span>idB<span style="color: #66cc66;">,</span> B<span style="color: #66cc66;">.</span>valB<span style="color: #66cc66;">,</span> B<span style="color: #66cc66;">.</span>booleen <br />
<span style="color: #993333; font-weight: bold;">FROM</span> A <br />
<span style="color: #993333; font-weight: bold;">LEFT</span> <span style="color: #993333; font-weight: bold;">OUTER</span> <span style="color: #993333; font-weight: bold;">JOIN</span> B <span style="color: #993333; font-weight: bold;">ON</span> B<span style="color: #66cc66;">.</span>idA <span style="color: #66cc66;">=</span> A<span style="color: #66cc66;">.</span>idA <br />
<span style="color: #993333; font-weight: bold;">WHERE</span> B<span style="color: #66cc66;">.</span>booleen <span style="color: #66cc66;">=</span> <span style="color: #cc66cc;">1</span></div></td></tr></tbody></table></div>
<p>=> Résultat :<br />
idA, valA, idB, valB, booleen<br />
3, &lsquo;tata&rsquo;, 2, &lsquo;fifi&rsquo;, 1</p>
<p>La seule ligne qui répond à la condition est celle de fifi. On n&rsquo;a plus toutes les lignes de A.<br />
J&rsquo;aurais obtenu le même résultat avec une jointure interne. Démonstration&#8230;</p>
<p>1ère requête sans WHERE<br />
=> Code :</p>
<div class="codecolorer-container sql default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br /></div></td><td><div class="sql codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #993333; font-weight: bold;">SELECT</span> A<span style="color: #66cc66;">.</span>idA<span style="color: #66cc66;">,</span> A<span style="color: #66cc66;">.</span>valA<span style="color: #66cc66;">,</span> B<span style="color: #66cc66;">.</span>idB<span style="color: #66cc66;">,</span> B<span style="color: #66cc66;">.</span>valB<span style="color: #66cc66;">,</span> B<span style="color: #66cc66;">.</span>booleen <br />
<span style="color: #993333; font-weight: bold;">FROM</span> A <br />
<span style="color: #993333; font-weight: bold;">INNER</span> <span style="color: #993333; font-weight: bold;">JOIN</span> B <span style="color: #993333; font-weight: bold;">ON</span> B<span style="color: #66cc66;">.</span>idA <span style="color: #66cc66;">=</span> A<span style="color: #66cc66;">.</span>idA</div></td></tr></tbody></table></div>
<p>=> Résultat :<br />
idA, valA, idB, valB, booleen<br />
2, &lsquo;titi&rsquo;, 1, &lsquo;riri&rsquo;, 0<br />
3, &lsquo;tata&rsquo;, 2, &lsquo;fifi&rsquo;, 1</p>
<p>2ème requête avec le WHERE :<br />
=> Code :</p>
<div class="codecolorer-container sql default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br /></div></td><td><div class="sql codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #993333; font-weight: bold;">SELECT</span> A<span style="color: #66cc66;">.</span>idA<span style="color: #66cc66;">,</span> A<span style="color: #66cc66;">.</span>valA<span style="color: #66cc66;">,</span> B<span style="color: #66cc66;">.</span>idB<span style="color: #66cc66;">,</span> B<span style="color: #66cc66;">.</span>valB<span style="color: #66cc66;">,</span> B<span style="color: #66cc66;">.</span>booleen <br />
&nbsp;<span style="color: #993333; font-weight: bold;">FROM</span> A <br />
&nbsp;<span style="color: #993333; font-weight: bold;">INNER</span> <span style="color: #993333; font-weight: bold;">JOIN</span> B <span style="color: #993333; font-weight: bold;">ON</span> B<span style="color: #66cc66;">.</span>idA <span style="color: #66cc66;">=</span> A<span style="color: #66cc66;">.</span>idA <br />
<span style="color: #993333; font-weight: bold;">WHERE</span> B<span style="color: #66cc66;">.</span>booleen <span style="color: #66cc66;">=</span> <span style="color: #cc66cc;">1</span></div></td></tr></tbody></table></div>
<p>=> Résultat :<br />
idA, valA, idB, valB, booleen<br />
3, &lsquo;tata&rsquo;, 2, &lsquo;fifi&rsquo;, 1</p>
<p>Reprenons maintenant la jointure externe et mettons la restriction dans la clause de jointure :<br />
=> Code :</p>
<div class="codecolorer-container sql default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br /></div></td><td><div class="sql codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #993333; font-weight: bold;">SELECT</span> A<span style="color: #66cc66;">.</span>idA<span style="color: #66cc66;">,</span> A<span style="color: #66cc66;">.</span>valA<span style="color: #66cc66;">,</span> B<span style="color: #66cc66;">.</span>idB<span style="color: #66cc66;">,</span> B<span style="color: #66cc66;">.</span>valB<span style="color: #66cc66;">,</span> B<span style="color: #66cc66;">.</span>booleen <br />
&nbsp;<span style="color: #993333; font-weight: bold;">FROM</span> A <br />
&nbsp;<span style="color: #993333; font-weight: bold;">LEFT</span> <span style="color: #993333; font-weight: bold;">OUTER</span> <span style="color: #993333; font-weight: bold;">JOIN</span> B <span style="color: #993333; font-weight: bold;">ON</span> B<span style="color: #66cc66;">.</span>idA <span style="color: #66cc66;">=</span> A<span style="color: #66cc66;">.</span>idA <br />
&nbsp; <span style="color: #993333; font-weight: bold;">AND</span> B<span style="color: #66cc66;">.</span>booleen <span style="color: #66cc66;">=</span> <span style="color: #cc66cc;">1</span></div></td></tr></tbody></table></div>
<p>=> Résultat :<br />
idA, valA, idB, valB, booleen<br />
1, &lsquo;toto&rsquo;, NULL, NULL, NULL<br />
2, &lsquo;titi&rsquo;, NULL, NULL, NULL<br />
3, &lsquo;tata&rsquo;, 2, &lsquo;fifi&rsquo;, 1</p>
<p>La jointure est faite sur les données restreintes au booleen = 1, c&rsquo;est à dire seulement fifi mais toutes les lignes de A sont affichées, avec NULL dans les colonnes de B quand il n&rsquo;y a pas de correspondance.</p>
<p><strong>Conclusion :</strong></p>
<p>Avec une jointure externe, il faut déplacer les conditions de restriction sur la table externe du WHERE vers la condition de jointure. Sinon c&rsquo;est l&rsquo;équivalent d&rsquo;une jointure interne. </p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
	</channel>
</rss>
