﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-比尔德blog -随笔分类-数据库开发</title><link>http://www.blogjava.net/proglion/category/10523.html</link><description /><language>zh-cn</language><lastBuildDate>Thu, 01 Mar 2007 02:32:56 GMT</lastBuildDate><pubDate>Thu, 01 Mar 2007 02:32:56 GMT</pubDate><ttl>60</ttl><item><title>关于SQL Server的inner join与outer join</title><link>http://www.blogjava.net/proglion/archive/2006/04/27/43479.html</link><dc:creator>比尔德</dc:creator><author>比尔德</author><pubDate>Thu, 27 Apr 2006 01:59:00 GMT</pubDate><guid>http://www.blogjava.net/proglion/archive/2006/04/27/43479.html</guid><description><![CDATA[
		<p>
				<font color="#000000">当需要从不止一个表中查询所需要的数据时，就要用到join。<br /><br />最常用的join方式是inner join，其语法规则如下：<br />     select 字段名 from 主要资料表 inner join 次要资料表 on &lt;join规则&gt;<br />以northwind数据库为例，在QA中输入如下脚本：<br />     select ProductId, ProductName, Suppliers.CompanyName from Products<br />              inner join Suppliers on Products.SupplierId = Suppliers.SupplierID<br />注意，inner join的主要精神就是 exclusive , 叫它做排他性吧! 就是讲 Join 规则不相符的资料就会被排除掉, 譬如讲在 Product 中有一项产品的供货商代码 (SupplierId), 没有出现在 Suppliers 资料表中, 那么这笔记录便会被排除掉 。<br /><br />Outer Join  <br />这款的 Join 方式是一般人比较少用到的, 甚至有些 SQL 的管理者也从未用过, 这真是一件悲哀的代志, 因为善用 Outer Join 是可以简化一些查询的工作的, 先来看看 Outer Join 的语法  <br />Select &lt;要查询的字段&gt; From &lt;Left 资料表&gt;  <br />&lt;Left | Right&gt; [Outer] Join &lt;Right 资料表&gt; On &lt;Join 规则&gt;  <br />语法中的 Outer 是可以省略的, 例如你可以用 Left Join 或是 Right Join, 在本质上, Outer Join 是 inclusive, 叫它做包容性吧! 不同于 Inner Join 的排他性, 因此在 Left Outer Join 的查询结果会包含所有 Left 资料表的资料, 颠倒过来讲, Right Outer Join 的查询就会包含所有 Right 资料表的资料, 接下来我们还是来做些实际操作, 仍然是使用北风数据库, 但要先做一些小小的修改, 才能达到我们要的结果  <br />首先要拿掉 Products 资料表的 Foreign Key, 否则没有法度在 Products 资料表新增一笔 SupplierId 没有对映到 Suppliers 资料表的纪录, 要知影一个资料表的 Constraint 你可以执行 SQL 内建的 sp_helpconstraint , 在 QA 执行  <br />sp_helpconstraint Products  <br />接下来删除 FK_Products_Suppliers 这个 Foreign Key  <br />Alter Table Products  <br />Drop Constraint FK_Products_Suppliers  <br />再来新增一笔纪录于 Products 资料表, SupplierId 使用 50 是因为它并没有对映到 Suppliers 资料表中的记录  <br />Insert Into Products (ProductName,SupplierId,CategoryId)  <br />values ('Test Product','50','1')  <br />现在我们再执行头前的查询, 只是将 Inner Join 改为 Left Outer Join  <br />Select ProductId, ProductName, Suppliers.SupplierId  <br />From Products  <br />Left Outer Join Suppliers  <br />Products.Suppliers = Suppliers.SupplierId  <br />比较一下两种 Join 方式的查询结果, 你应该就会知影其中的差别!  <br />再来看看 Right Outer Join, 请新增下底这笔记录  <br />Insert Into Suppliers (CompanyName)  <br />values ('LearnASP')  <br />现在请使用 Right Out Join 来作查询, 比较看看查询的结果和 Inner Join 有什么不同!  <br />寻找不相符纪录  <br />这里我们来看看如何使用 Out Join 来找不相符纪录, 可能是有子纪录却没有父纪录或是颠倒过来  <br />Select Suppliers.CompanyName From Products  <br />Right Join Suppliers  <br />On Products.SupplierId = Suppliers.SupplierId  <br />Where Products.SupplierId is Null  <br />执行结果你会找到一笔资料为 LearnASP, 该笔供货商资料存在, 但基本上已经没有产品是来自这个供货商, 想象一下如果不用 Outer Join 你要怎么以一个 SQL 指令完成同一查询结果! 知道 Outer Join 的好用了吧! 再执行  <br />Select Products.ProductName  <br />From Products  <br />Left Join Suppliers  <br />On Products.SupplierId = Suppliers.SupplierId  <br />Where Suppliers.SupplierId is Null  <br />这个查询结果你会发现 Test Product 这项产品竟然找不到供货商的资料!  <br /></font>
		</p>
<img src ="http://www.blogjava.net/proglion/aggbug/43479.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/proglion/" target="_blank">比尔德</a> 2006-04-27 09:59 <a href="http://www.blogjava.net/proglion/archive/2006/04/27/43479.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>