隨筆 - 6  文章 - 0  trackbacks - 0

          當需要從不止一個表中查詢所需要的數據時,就要用到join。

          最常用的join方式是inner join,其語法規則如下:
          ???? select 字段名 from 主要資料表 inner join 次要資料表 on <join規則>
          以northwind數據庫為例,在QA中輸入如下腳本:
          ?????select ProductId, ProductName, Suppliers.CompanyName from Products
          ???????????? ?inner join Suppliers on Products.SupplierId = Suppliers.SupplierID
          注意,inner join的主要精神就是?exclusive?,?叫它做排他性吧!?就是講?Join?規則不相符的資料就會被排除掉,?譬如講在?Product?中有一項產品的供貨商代碼?(SupplierId),?沒有出現在?Suppliers?資料表中,?那么這筆記錄便會被排除掉?。

          Outer?Join?
          這款的?Join?方式是一般人比較少用到的,?甚至有些?SQL?的管理者也從未用過,?這真是一件悲哀的代志,?因為善用?Outer?Join?是可以簡化一些查詢的工作的,?先來看看?Outer?Join?的語法?
          Select?<要查詢的字段>?From?<Left?資料表>?
          <Left?|?Right>?[Outer]?Join?<Right?資料表>?On?<Join?規則>?
          語法中的?Outer?是可以省略的,?例如你可以用?Left?Join?或是?Right?Join,?在本質上,?Outer?Join?是?inclusive,?叫它做包容性吧!?不同于?Inner?Join?的排他性,?因此在?Left?Outer?Join?的查詢結果會包含所有?Left?資料表的資料,?顛倒過來講,?Right?Outer?Join?的查詢就會包含所有?Right?資料表的資料,?接下來我們還是來做些實際操作,?仍然是使用北風數據庫,?但要先做一些小小的修改,?才能達到我們要的結果?
          首先要拿掉?Products?資料表的?Foreign?Key,?否則沒有法度在?Products?資料表新增一筆?SupplierId?沒有對映到?Suppliers?資料表的紀錄,?要知影一個資料表的?Constraint?你可以執行?SQL?內建的?sp_helpconstraint?,?在?QA?執行?
          sp_helpconstraint?Products?
          接下來刪除?FK_Products_Suppliers?這個?Foreign?Key?
          Alter?Table?Products?
          Drop?Constraint?FK_Products_Suppliers?
          再來新增一筆紀錄于?Products?資料表,?SupplierId?使用?50?是因為它并沒有對映到?Suppliers?資料表中的記錄?
          Insert?Into?Products?(ProductName,SupplierId,CategoryId)?
          values?('Test?Product','50','1')?
          現在我們再執行頭前的查詢,?只是將?Inner?Join?改為?Left?Outer?Join?
          Select?ProductId,?ProductName,?Suppliers.SupplierId?
          From?Products?
          Left?Outer?Join?Suppliers?
          Products.Suppliers?=?Suppliers.SupplierId?
          比較一下兩種?Join?方式的查詢結果,?你應該就會知影其中的差別!?
          再來看看?Right?Outer?Join,?請新增下底這筆記錄?
          Insert?Into?Suppliers?(CompanyName)?
          values?('LearnASP')?
          現在請使用?Right?Out?Join?來作查詢,?比較看看查詢的結果和?Inner?Join?有什么不同!?
          尋找不相符紀錄?
          這里我們來看看如何使用?Out?Join?來找不相符紀錄,?可能是有子紀錄卻沒有父紀錄或是顛倒過來?
          Select?Suppliers.CompanyName?From?Products?
          Right?Join?Suppliers?
          On?Products.SupplierId?=?Suppliers.SupplierId?
          Where?Products.SupplierId?is?Null?
          執行結果你會找到一筆資料為?LearnASP,?該筆供貨商資料存在,?但基本上已經沒有產品是來自這個供貨商,?想象一下如果不用?Outer?Join?你要怎么以一個?SQL?指令完成同一查詢結果!?知道?Outer?Join?的好用了吧!?再執行?
          Select?Products.ProductName?
          From?Products?
          Left?Join?Suppliers?
          On?Products.SupplierId?=?Suppliers.SupplierId?
          Where?Suppliers.SupplierId?is?Null?
          這個查詢結果你會發現?Test?Product?這項產品竟然找不到供貨商的資料!?

          posted on 2006-04-27 09:59 比爾德 閱讀(650) 評論(0)  編輯  收藏 所屬分類: 數據庫開發
          主站蜘蛛池模板: 缙云县| 阿克苏市| 泸定县| 遵义市| 涿鹿县| 扎囊县| 汉寿县| 靖宇县| 当雄县| 巨野县| 台南县| 石门县| 横山县| 万荣县| 五家渠市| 明溪县| 福安市| 蕉岭县| 江津市| 开平市| 家居| 嘉义市| 华亭县| 平昌县| 龙口市| 清水河县| 伊吾县| 玉溪市| 六安市| 安新县| 保山市| 威海市| 维西| 封开县| 苗栗县| 务川| 句容市| 明光市| 南宁市| 湘潭县| 余庆县|