文章編號: 136699 - 上次校閱: 2007年11月29日 - 版次: 4.1

關於 Microsoft Query 中聯結用法的說明

系統提示本文適用於您使用的作業系統之外的作業系統。與您不相關的文章內容已停用。

在此頁中

全部展開 | 全部摺疊

結論

本文討論在 Microsoft Query 中使用聯結。聯結是一種可以與資料庫一起使用的方法,用於定義和說明兩個表之間的關係。在 Microsoft Query 中,可以建立和操作各種類型的聯結。在許多情況下,Microsoft Query 會為您聯結查詢中的資料表。在 [資料表] 窗格中,資料表是由連接各資料表的線條表示。

本文涵蓋如下主題:

什麼是聯結? 內部聯結 SQL 語句 外部聯結 減聯結 完整外部聯結自聯結 同等聯結自然聯結 笛卡爾乘積

其他相關資訊

什麼是聯結?

聯結是兩個資料表之間的連結,其中兩個資料表依據它們都擁有的一個欄位合併在一起,從而建立一個新的虛擬表 (可以保存為實際的資料表)。例如,以下列兩個資料表來說:

Color_Table:  Join_Field   Color_Field 1            Red2            Blue3            GreenPattern_Table:Join_Field   Pattern_Field2            Striped3            Checkered4            Polka-Dot


簡單的聯結如下所示:

Join_Field   Color_Field      Pattern_Field2            Blue             Striped3            Green            Checkered


結果資料表只包含 Join_Field 欄位中的記錄 2 和 3,原因是只有這兩個記錄同時存在於 Color_Table 和 Pattern_Table 中。

聯結的一個實際範例是零售商的產品和製造商清單;可以根據 Product ID 欄位來聯結 Products 資料表和 Vendors 資料表。

內部聯結

上例中的聯結稱為內部聯結,它是最簡單的聯結類型。通常,您只想使用資料表中的一小部分欄位。例如,在實際的內部聯結中 (例如上例中的聯結),您可能想要排除 Join_Field,使聯結看起來類似於這樣:

Color_Field      Pattern_FieldBlue             StripedGreen            Checkered


在 Microsoft Query 中,內部聯結是預設的聯結類型 (有關更多資訊,請參閱《Microsoft Query 使用者指南》1.0 版的第 105 頁)。

SQL 語句

「結構化查詢語言」(SQL) SELECT 陳述式是一種巨集,您可以在建立聯結時使用它。請注意,SQL 與 Microsoft Excel 的其他巨集語言 (Visual Basic for Applications 和 Excel 4.0 巨集語言) 大不相同。

您不必瞭解 SQL 就能在 Microsoft Query 中輕鬆建立聯結。

每個聯結都有 SELECT 陳述式與其關聯。透過按一下工具列上的 [SQL],您可以在 Microsoft Query 中查看對應於任何聯結的 SELECT 陳述句。像 Microsoft Excel 的巨集錄製器一樣,您可以使用 Query 來記錄 SELECT 陳述式。與 Microsoft Excel 的巨集錄製器不同的是,SELECT 陳述式錄製器始終處於開啟狀態且無法關閉。對應於上述內部聯結的 SELECT 陳述式在 Microsoft Query 中看起來如下所示:

SELECT Color_Table.Color_Field, Pattern_Table.Pattern_FieldFROM c:\database.mdb Color_Table, c:\database.mdbPattern_TableWHERE Color_Table.Join_Field = Pattern_Table.Join_Field


請注意,.mdb 是 Microsoft Access 資料庫的副檔名,它可以在一個檔案中包含多個資料表。在其他一些資料庫中,例如在 dBASE、Paradox 和 FoxPro 中,每個資料表均必須有它自己的檔。在這些情況下,因為資料表名稱總是與不帶副檔名的檔案名相同,所以 SQL 語法可能會顯得多餘。

SQL 語法因查詢引擎而異;例如,在 Microsoft Access 中,上例中的查詢將如下所示:

SELECT Color_Table.[Color_Field],Pattern_Table.Pattern_FieldFROM Pattern_Table INNER JOIN Color_Table ONPattern_Table.[Join_Field] = Color_Table.[Join_Field];


因為資料表位於 Microsoft Access .mdb 檔中,所以在 Microsoft Access 中不使用資料表的路徑。即使在查詢中附加並使用外部資料表,Microsoft Access SQL 陳述式也不會顯示外部資料表的路徑。



外部聯結

另一種聯結稱為外部聯結。透過對兩個資料表使用外部聯結,可以取得第一個資料表中的所有記錄,以及第二個資料表中具有值與第一個資料表相符的那些記錄。這可能使一部分欄位項目保留空白,或為"NULL"。對於任何兩個要聯結的資料表,有兩種可能的外部聯結,即「左外部聯結」和「右外部聯結」(之所以這樣命名,是因為通常會並排地查看資料表)。以前面兩個資料表為例,下面是兩種可能的外部聯結之一:

Join_Field   Color_Field   Pattern_Field1            Red           (NULL)2            Blue          Striped3            Green         Checkered


另一種可能的聯結如下所示:

Join_Field   Color_Field   Pattern_Field2            Blue          Striped3            Green         Checkered4            (NULL)         Polka-Dot


注意:在聯結中檢視資料時並不會看到文字 "NULL";請在處理聯結時,使用關鍵字 "NULL"。

在 Microsoft Query 中,使用滑鼠即可輕鬆建立兩種外部聯結 (有關此過程的更多資訊,請參閱《Microsoft Query 使用者指南》1.0 版的第 112 頁)。

對應於外部聯結的第二個範例的 SQL 陳述式看起來如下所示:

SELECT Color_Table.Color_Field, Pattern_Table.Pattern_FieldFROM {oj c:\database.mdb Color_Table LEFT OUTER JOINc:\database.mdb Pattern_Table ON Color_Table.Join_Field =Pattern_Table.Join_Field}


若要建立外部聯結的實際範例,請製作某公司的產品清單,清單中含有已售出產品的銷售數字,但並未排除未售出的產品。請使用 Product ID 欄位聯結 Products 資料表和 Sales 資料表來執行這項作業。

減聯結

第三種聯結是減聯結。減聯結與外部聯結相反;它僅包含資料表中不符合另一個資料表中任何記錄的那些記錄。像外部聯結一樣,您想聯結的任何兩個資料表都有兩種可能的減聯結;但是,它們通常並不稱為「左減聯結」或「右減聯結」。減聯結接通常只返回其中一個資料表的欄位,原因是根據定義,另一個資料表的欄位只傳回 NULL 值。以下是一種可能的減聯結:

join_Field   Color_Field1            Red


而以下是另一種:

Join_Field   Pattern_Field4            Polka-Dot


在 Microsoft Query 中,減聯結的建立方法如下:先建立外部聯結,然後在適當的欄位 (上面第一個範例中的 Pattern_Field;第二個範例中的 Color_Field)上使用 "IS NULL" 條件,以排除在資料表之間相符的記錄。

對應於上面第一個減聯結的 SQL 陳述式看起來如下所示:

SELECT Color_Table.Join_Field, Color_Table.Color_FieldFROM {oj c:\database.mdb Color_Table LEFT OUTER JOINc:\database.mdb Pattern_Table ON Color_Table.Join_Field =Pattern_Table.Join_Field}WHERE (Pattern_Table.Pattern_Field Is Null)


減聯結的一個實際範示是,建立最近未訂貨的客戶的清單。為此,請使用 Order ID 欄位來聯結 Customers 資料表和 Orders 資料表。

完全外部聯結

第四種聯結是完全外部聯結。完全外部聯結是外部聯結及其補充減聯結的組合。完全外部聯結包含兩個資料表中的所有記錄,並且合併兩個資料表都擁有的記錄。以下是一個完全外部聯結:

Join_Field   Color_Field   Pattern_Field1            Red           (NULL)2            Blue          Striped3            Green         Checkered4            (NULL)        Polka-Dot




在 Microsoft Query 中,完全外部聯結的建立方式如下:在外部聯結的 SELECT 陳述式和減聯結的 SELECT 陳述式 (參見上例) 之間,另起一行插入 UNION 運算子。

要在 Microsoft Query 中建立完全外部聯結,請執行以下步驟:

  1. 建立一個外部聯結,然後在 [檔案] 功能表上按一下 [新增],建立一個減聯結。
  2. 複製該減聯結的 SQL。
  3. 切換到外部聯結,在該外部聯結的 SQL 語句下另起一行輸入文字 UNION,在文字 UNION 下貼上減聯結的 SQL,然後關閉減聯結的視窗。
對應於上述完全外部聯結的 SQL 看起來如下所示 (UNION 運算子下的命令是貼上的):

SELECT Color_Table.Join_Field, Color_Table.Color_Field,Pattern_Table.Pattern_FieldFROM {oj c:\database.mdb Pattern_Table LEFT OUTER JOINc:\database.mdb Color_Table ON Color_Table.Join_Field =Pattern_Table.Join_Field}UNIONSELECT Color_Table.Join_Field, Color_Table.Color_Field,Pattern_Table.Pattern_FieldFROM {oj c:\database.mdb Pattern_Table LEFT OUTER JOINc:\database.mdb Color_Table ON Color_Table.Join_Field =Pattern_Table.Join_Field}WHERE (Color_Table.Color_Field Is Null)


完全外部聯結的一個實際範示是,合併由不同部門使用的重疊客戶清單,其中包含傳真號碼 (只出現在第一個清單上) 和 Internet 電子郵件名稱 (只出現在第二個清單中)。每個部門可以繼續使用其不完整的清單,同時也可以使用完整的聯結清單。這些清單可以根據 Customer ID 欄位而連結。

自聯結

第五種聯結是自聯結。在自聯結這種連結中,某個資料表中的欄位會與相同資料表副本中的另一個欄位相符。請使用此範例資料表:

Table_ThreeEmployee_ID   Employee_Name   Reports_To1             Bob             32             Sue             (NULL)3             Jim             24             Jane            3


以及它的副本,如下所示:

Table_Three_01Employee_ID   Employee_Name   Reports_To1             Bob             32             Sue             (NULL)3             Jim             24             Jane            3


可以使用自聯結來建立含有員工姓名和員工主管姓名的清單。Table_Three 中的 Employee_ID 將與 Table_Three_01 中的 Reports_To 聯結。一開始可能看來如下:

Employee_Name   Employee_NameBob             JimSue             (NULL)Jim             SueJane            Jim


但是,兩個欄位如有相同的欄位名會造成混亂,因此請更改其中一個欄位名,如下所示:

Employee_Name   SupervisorBob             JimSue             (NULL)Jim             SueJane            Jim


對應於上述自聯結的 SQL 看起來如下所示:

SELECT table_three.Employee_Name,table_three_01.Employee_Name 'Supervisor'FROM c:\database.mdb table_three, c:\database.mdbtable_three_01WHERE table_three.Employee_ID = table_three_01.Reports_To


將資料傳回到 Microsoft Excel 時,在 Microsoft Query 中重新命名欄位並不會有作用。這是因為 Microsoft Excel 使用原始欄位名稱。如需此問題的詳細資訊,請參閱「Microsoft 知識庫」的下列文章:

121551? (http://support.microsoft.com/kb/121551/ ) : XL:傳回到 Excel 的是 MSQUERY 中的欄位名稱而不是資料行名稱

每次重新整理傳回的資料時,Microsoft Excel 巨集都必須變更資料行名稱 (除非在樞紐分析表中傳回資料,因為樞紐分析表本身可建立和保留自訂的欄位名稱)。

同等聯結和自然聯結

幾乎所有聯結 (包括到目前為止所提供的所有範例) 都是同等聯結和自然聯結。這些詞彙的含義對於 Microsoft Query 的一般使用者並不重要,但以下兩個段落會試著解釋這些詞彙,以供對它們感到好奇的使用者參考。

在同等聯結中是根據聯結欄位在兩個資料表中是否有相符的值來擷取記錄。這似乎與聯結的定義完全相同,但其實不然。非同等聯結的一個範例是:在某個聯結中,第一個資料表中的記錄聯結到第二個資料表中的某些記錄,而對這些記錄而言,第一個資料表中的聯結欄位大於 (而不是等於) 第二個資料表中的聯結欄位 (或者是小於,或者是除了等於以外的任何比較關係)。自然而然地,這將會傳回比同等聯結更多的記錄。

自然聯結是只傳回兩個資料表之一的聯結欄位的聯結。由於根據定義這兩個欄位在同等聯結中是相同的,因此,包含這兩個欄位是重複的做法。對於非同等聯結,包含這兩個欄位很重要。因此,同等聯結和自然聯結是形影不離的。您可能希望通過只返回一個聯結欄位使同等聯結(它描述了大多數聯結)成為自然聯結;但是,如果您確實使用一個非同等聯結,則也可能想通過返回兩個聯結欄位使其成為非自然聯結。

現實中還有其他類型的聯結。聯結的所有類型是在 1992 年才定義,而此標準稱為 SQL-92。某些聯結對於 Microsoft Excel 的使用者並不重要,原因是它們執行的作業在 Microsoft Excel 中能以更輕鬆的方式完成。

笛卡爾乘積

如果試著從兩個或更多個沒有任何聯結的資料表傳回資料,就會產生所謂的「笛卡爾乘積」。笛卡爾乘積的定義是,由全部資料表中的資料列構成的所有可能組合。在嘗試傳回資料之前,請確保您具有聯結,因為如果資料表含有許多記錄,或者資料表很多,則笛卡爾乘積可能需要幾個小時才能完成。以下是在兩個範例資料表上使用的笛卡爾乘積;請注意,此資料表僅包含 3 x 3 個記錄,這總共會產生 9 個記錄。但是,假設資料表包含 100 x 1,000 x 10,000 個記錄,那麼資料表將會包含 1,000,000,000 個記錄!

Join_Field   Join_Field   Color_Field   Pattern_Field1            2            Red           Striped1            3            Red           Checkered1            4            Red           Polka-Dot2            2            Blue          Striped2            3            Blue          Checkered2            4            Blue          Polka-Dot3            2            Green         Striped3            3            Green         Checkered3            4            Green         Polka-Dot


有時候有些使用者會想使用笛卡爾乘積,但大多數取得笛卡爾乘積的使用者只是無意中這樣做,而且笛卡爾乘積通常會使他們混淆。因為大多數的使用者會排除聯結中的大部分欄位,所以實際的笛卡爾乘積很容易就變得非常使人困惑,如下所示:

Color_FieldRedRedRedBlueBlueBlueGreenGreenGreen


如果向 Pattern_Table 如果對 Pattern_Table 添加 100 個記錄,此查詢將產生 309 個記錄 (每個 Red、Blue 和 Green 分別有 103 個記錄)。

笛卡爾乘積的 SELECT 陳述式相對來說反而簡單。對應於上述笛卡爾乘積的 SQL 看起來如下所示:

SELECT Color_Table.Color_Field, Pattern_Table.Pattern_FieldFROM c:\database.mdb Color_Table, c:\database.mdbPattern_Table


笛卡爾乘積的一個實際範例是建立某件商品所有可能的選項組合的清單,且在其中包含每種組合的總價。

?考

Microsoft Query《使用者指南》1.0 版,第 101-114、123-131 頁

以下兩本書未隨任何 Microsoft 產品提供,而且並非由 Microsoft 出品。

本文所討論的協力廠商產品是由與 Microsoft 無關的其他供應商生產的;對這些產品的性能或可靠性,我們不作任何默示或其他形式的保證。

《Understanding the New SQL:A Complete Guide》,Morgan Kaufmann Publishers, Inc.,1993。

《Joe Celko's SQL for Smarties:Advanced SQL Programming》,Morgan Kaufmann Publishers, Inc.,1995。

如需在 Microsoft Query 中建立聯結的詳細資訊,請在 [?明] 中選擇 [搜尋] 按鈕,然後輸入:

聯結,概述

這篇文章中的資訊適用於:
  • Microsoft Office Excel 2007
  • Microsoft Office Excel 2003
  • Microsoft Excel 2002 Standard Edition
  • Microsoft Excel 2000 Standard Edition
  • Microsoft Excel 97 Standard Edition
  • Microsoft Excel 95 Standard Edition
  • Microsoft Excel 5.0 Standard Edition
  • Microsoft Excel X for Mac
  • Microsoft Excel 2001 for Macintosh
  • Microsoft Excel 98 for Macintosh
  • Microsoft Query 2000
關鍵字:?
kbhowto kbinfo KB136699
Microsoft及(或)其供應商不就任何在本伺服器上發表的文字資料及其相關圖表資訊的恰當性作任何承諾。所有文字資料及其相關圖表均以「現狀」供應,不負任何擔保責任。Microsoft及(或)其供應商謹此聲明,不負任何對與此資訊有關之擔保責任,包括關於適售性、適用於某一特定用途、權利或不侵權的明示或默示擔保責任。Microsoft及(或)其供應商無論如何不對因或與使用本伺服器上資訊或與資訊的實行有關而引起的契約、過失或其他侵權行為之訴訟中的特別的、間接的、衍生性的損害或任何因使用而喪失所導致的之損害、資料或利潤負任何責任。