當您在同一個 Access 查詢中併入多個資料來源時,可以根據各個資料來源之間的相互關係,來利用聯結來減少最終看到的記錄數量。 連接也可以用來結合兩個資料來源的記錄,讓多個來源的每一組記錄都成為查詢結果中的單一筆記錄。
本文討論各種連接類型,並示範如何在查詢中使用連接。 根據預設,如果您在查詢中使用的兩個資料來源之間已經有關聯,則會自動建立聯結。 如果有明確互相對應的欄位,也會建立聯結。 您可以刪除自動建立的聯結。 本文提供有關資料表關聯的基本資訊,包括如何建立資料表關聯。
注意
您可以以聯結資料表的相同方式聯結查詢,也可以將兩者聯結。
本文內容
- 概觀
- 連接種類
- 聯結的資料表中若有共通值存在,則會顯示資料列
- 顯示某個資料表的所有資料列,以及另一個資料表的對應資料列
- 顯示來自這兩個資料表的所有資料列,並在有共通值存在時加以聯結
- 交叉聯結
- 根據不相等的欄位值聯結資料表
- 刪除聯結
概觀
資料庫是承載了資料表彼此邏輯關聯之資料的資料表集合。 您可以使用關聯來依資料表擁有的共通欄位連接資料表。 資料表可以包含任何數量的關聯,但每個關聯一律有確切兩個資料表。 在查詢中,關聯會以聯結表示。
當你在查詢中加入資料表時,Access 會建立基於資料表間已定義關係的連接。 您可以在查詢中手動建立聯結,即使它們之間未呈現已定義的關聯亦然。 如果您使用其他查詢 (而非資料表或除了資料表) 做為查詢的資料來源,您可以在來源查詢之間,以及這些查詢與用來做為資料來源的任何資料表之間建立聯結。
聯結的運作方式與查詢準則類似,在於會建立資料必須符合才能併入查詢作業中的規則。 與準則不同之處在於,聯結也會指定將符合聯結條件的每對資料列結合,以形成單一資料列。
聯結基本上共有四個類型:內部聯結、外部聯結、交叉聯結以及不相等聯結。 本文探索您可以使用的每個聯結類型,為何使用各個類型,以及如何建立聯結。
連接之於查詢,就像關聯性之於資料表:連接表示兩個來源的資料如何根據共通的資料值來做結合。 這裡有一個在查詢設計檢視中連接的示意圖,連接的屬性在對話框中開啟:
資料表之間的線代表聯結。 雙擊「加入」後, () 顯示的「 加入屬性 」對話框,並檢視或更改加入內容。
連接有時具有方向性。 對話方塊的此區域顯示連接中哪些資料表代表甚麼,以及哪些欄位會用於連接資料表。
此區域指定連接類型:選項 1 是內部連接,選項 2 是左外部連接,選項 3 是右外部連接。
兩個資料表的欄位均可使用,並會顯示各資料表中與特定工作相關的資料。 內部連接中不會加入其他資料。 在外部連接中,查詢結果會包含其中一個表格裡不相關的資料。
連接種類
連接基本上共有四種:內部連接、外部連接、交叉連接以及不相等連接。 交叉連接及不相等連接是進階的連接類型,極少使用;但是為了完全理解連接的運作方式,您還是應該要知道這兩種類型。
內部連接:僅結合兩邊資料表的相關資料
內部連結即是 Access 僅會在相關資料表中含有對應資料時,才加入該資料表的資料,反之亦然。 多數時候您都會使用內部連接。 當你建立一個連接但沒有指定是什麼類型的連接時,Access 會假設你想要一個內部連接。 內部連接很有用,因為它能讓你根據共享的值將兩個來源的資料合併——所以只有在有完整畫面時才會看到資料。
外部連接:所有關聯資料均正確結合,加上其中一個表格的其他所有記錄
外部連接跟內部連接一樣,只是加入了其中一個資料表剩餘的所有資料列。 外部連接具有方向性:左外部連接會加入左資料表 (即連接中的第一個資料表) 的所有記錄,而右外部連接會加入右資料表 (即連接中的第二個資料表) 的所有記錄。
完整外部連接:所有資料,只要可行就會結合
有些系統的外部連接會包含兩個資料表中的所有資料列,並將相符的資料列結合。 這稱為完全外部連接,而 Access 並未明確支援。 不過,您可以利用交叉連接和準則來獲得相同效果。
交叉連接:所有資料,以所有可能的方式結合
大多數時候,交叉連接只是將兩個資料表加入查詢後,卻忘記連接資料表所造成的副作用。 Access 將此舉視為是您要將資料表的每一筆記錄,與另一個資料表的每一筆記錄相結合,亦即所有可能的組合。 因為不會結合資料,所以這種連接極少產生有用的結果。 但還是有幾種您會需要用到交叉連接的狀況。
不相等連接:與一般的連接相同,只是使用不同的比較方式來結合資料列。
不相等連接是使用等號 (=) 以外的運算子來比較資料值,決定是否結合資料及其結合方式。 不等連接雖然沒有明確支援,但你可以用交叉連接和條件來達到同樣效果。
聯結的資料表中若有共通值存在,則會顯示資料列
若僅要顯示連接欄位中具有相符值的資料列,則應使用內部連接。 Access 會自動建立內部連接。
內部連接是最常見的連接類型。 它們可告訴查詢,來自其中一個聯結資料表中的資料列,與另一個資料表中的資料列對應 (基於聯結欄位中的資料)。 執行一個含有內部連接的查詢時,只有在連接的兩個資料表中皆具有相同值的資料列會被加入查詢運算。
我該如何使用內部連接?
大多數情況下,您不必做任何動作就可以使用內部連接。 若您加入查詢的資料表已含有關聯關係,則在您加入資料表時,Access 會自動在每一組關聯資料表之間建立內部連接。 若強制執行參照完整性,存取還會在連接線上顯示「1」,表示一對多關係中哪個表格位於「一」側, ∞) (無限符號則顯示哪張表格位於「多」側。
即使你沒有建立關聯,Access 也會自動建立內部連接,只要你在查詢中加入兩個資料表,且每個資料表都有相同或相容的資料型別欄位,且其中一個連接欄位是主鍵。 此情況下不會顯示「一」與「多」符號,因為參考完整性並未強制執行。
若您在查詢中新增查詢,且未在這些查詢間建立關聯性,則 Access 不會自動建立這些查詢之間,或是查詢與資料表之間的內部連接。 一般而言,您應該自行建立。 您會透過將欄位從其中一個資料來源拖放至另一個資料來源的欄位,藉此建立內部聯結。 Access 在兩個欄位之間顯示一條線,表示已建立聯結。
內部聯結的 SQL 語法
內部連接是以 SQL 的 FROM 子句指定,如下所示:
從 table1 內部將 table2 連接到 table1。欄位1 比較表2。田野2
INNER JOIN 運算包含下列部分:
| 部分 | 描述 |
|---|---|
| table1, table2 | 結合記錄的來源資料表名稱。 |
| field1, field2 | 連接欄位的名稱。 若欄位非數字,則欄位必須屬於相同資料類型且包含相同類型的資料,但名稱不必相同。 |
| compare | 任何關係比較運算子:「=」、「<><=」、「>=」或「。」<> |
如需內部聯結語法的詳細資訊,請參閱內部聯結運算主題。
顯示某個資料表的所有資料列,以及另一個資料表的對應資料列
外部聯結會告訴查詢,雖然聯結兩端的部分資料列能夠完全對應,但查詢應該包含其中一個資料表的所有資料列,以及另一個資料表中在聯結兩端有共通值的那些資料列。
外部連接又可分為左外部連接與右外部連接。 在左外部連接,查詢會加入 SQL 敘述的 FROM 子句中所列的第一個資料表所有資料列,然後僅將另一個資料列中,連接欄位在雙方資料表均有相同值的資料列加入結果。 在右外部連接,查詢會加入 SQL 敘述的 FROM 子句中所列的第二個資料表所有資料列,然後僅將另一個資料列中,連接欄位在雙方資料表均有相同值的資料列加入結果。
注意
按兩下聯結,然後查看 [聯結屬性] 對話方塊,即可輕鬆地區分指定聯結中的哪個是左方資料表或右方資料表。 您可以也切換至 SQL 檢視,然後檢查 FROM 子句。
由於外部連接其中一端的部分資料列在另一個資料表中沒有對應的資料列,所以當資料列無法對應時,從另一個資料表傳回的查詢結果中會有一些空的欄位。
我該如何使用外部連接?
要建立外部連接時,請修改現有的內部連接。 若沒有內部連接存在,請建立一個,然後再將其變更為外部連接。
將內部連接變更為外部連接
- 在查詢 [設計檢視] 中,按兩下要變更的連接。
[聯結屬性] 對話方塊即會出現。 - 在 [聯結屬性] 對話方塊中,注意選項 2 及選項 3 旁邊所列的選擇。
- 按一下您要使用的選項,然後按一下 [確定]。
- Access 會顯示連接並且顯示一個箭頭,從要包含其所有資料列的資料來源指向只有包含滿足連接條件之資料列的資料來源。
不明確的外部連接
若您建立的查詢含有一個 LEFT JOIN (左連接) 以及一個 INNER JOIN (內部連接),則 Access 可能無法判斷應該先執行哪一個運算。 因為先執行左方聯結或先執行內部聯結所得到的結果不同,Access 會顯示錯誤訊息:
若要修正此錯誤,您必須修改查詢,明確指示應該先執行的聯結。
外部聯結的 SQL 語法
外部連接是以 SQL 的 FROM 子句指定,如下所示:
來自 表1 [左 |右 ] 加入 TABLE2
ON table1.field1 比較 table2.field2
LEFT JOIN 和 RIGHT JOIN 運算由下列各部分組成:
| 部分 | 描述 |
|---|---|
| table1, table2 | 結合記錄的來源資料表名稱。 |
| field1, field2 | 連接欄位的名稱。 欄位必須具有相同的資料型態且包含相同類型的資料,但名稱不必相同。 |
| compare | 任何關係比較運算子:「=」、「<><=」、「>=」或「。」<> |
如需外部聯結語法的詳細資訊,請參閱左方聯結與右方聯結運算主題。
顯示來自這兩個資料表的所有資料列,並在有共通值存在時加以聯結
當您想要顯示兩個資料表的所有資料列,並依共通值將其結合時,請使用完整外部聯結。 Access 並不直接支援完整外部聯結,但您可以利用聯集查詢達成相同效果。 以下程序說明如何執行此動作,但如果您需要聯集查詢的詳細資訊,請參閱請參閱小節。
若要使用聯集查詢執行完整外部聯結:
建立一個查詢,其中您想要用來進行完整外部聯結的欄位擁有左方外部聯結。
在 [常用] 索引標籤的 [檢視] 群組中,按一下 [檢視],再按一下 [SQL 檢視]。
按下 CTRL+C 以複製 SQL 程式碼。
刪除 FROM 子句結尾的分號,然後按下 ENTER。
輸入 UNION,然後按下 ENTER。
注意
當您使用聯集查詢來執行完整外部聯結時,請勿使用 ALL 關鍵字。
按下 CTRL+V,貼上您在步驟 3 複製的 SQL 程式碼。
在您貼上的程式碼中,將 LEFT JOIN 變更為 RIGHT JOIN。
刪除第二個 FROM 子句結尾的分號,然後按下 ENTER。
新增 WHERE 子句,指定在 FROM 子句中所列的第一個資料表 (左方資料表) 中,聯結欄位的值為 NULL。
例如,如果 FROM 子句為:FROM Products RIGHT JOIN [Order Details] ON Products.ID = [Order Details].[Product ID]您會新增以下這個 WHERE 子句:
WHERE Products.ID IS NULL在 WHERE 子句的結尾輸入一個分號 (;),做為聯集查詢的結尾。
在 [設計] 索引標籤上的 [結果] 群組中,按一下 [執行]。
交叉聯結
交叉連接與內接、外接不同,因為 Access 中未明確表示交叉連接。 在交叉連接中,來自一個資料表的每一個資料列,會與來自另一個資料表的每一個資料列結合,產生所謂的交叉乘積,或稱「笛卡兒乘積」。 每當您執行的查詢中有未明確聯結的資料表,結果會是交叉乘積。 交互聯結通常並非特意,但在一些情況下也很有用。
為什麼要使用交叉連接?
若您要查看兩個資料表或查詢之間所有可能的資料列組合,請使用交叉查詢。 例如,假設公司今年的銷售成績非常亮眼,您考慮要提供回饋給客戶。 您可以建置一個查詢,加總每一位客戶的購買額,再建立一個小資料表設定數種可能的回饋百分比,再於另一個查詢中結合兩個資料表,執行交叉查詢。 您最後會有一個查詢,顯示每位客戶的一組回饋假設。
我該如何使用交叉聯結?
當您在查詢中包含資料表或查詢,並且未為每個資料表或查詢建立至少一個明確聯結時,隨時會產生交叉聯結。 Access 會將來自每個資料表或查詢,未與任何其他資料表或查詢明確聯結的每一列結合到結果中的每個其他資料列。 考慮前一個段落中的回饋範例。 假設您有 91 位客戶,考慮採用的回饋比有五種。 您的交叉乘積會產生 455 個資料列 (91 乘以 5)。
如您所見,非刻意執行的交叉聯結可能會在查詢結果中產生大量的資料列。 此外,這些結果通常沒有意義,因為如果您實際上不想將每一個資料列與每個其他資料列合併,結果中顯示的多數合併的資料列將沒有意義。 最後,使用非刻意交互聯結的查詢可能需要很長的時間執行。
1。 圈起來的欄位應該彼此連接。
1。 請注意記錄數量非常多。
1. 請注意,記錄數量要少得多。
根據不相等的欄位值聯結資料表
連接並不一定要根據連接欄位的相等性。 連接可以是根據任何比較運算子進行,例如大於 (>)、小於 (<) 或不等於 (<>)。 不是根據相等性的連接,稱為不相等連接。
若您要根據不相等的欄位值來結合兩個資料來源的資料列,請使用不相等連接。 通常,不等連接基於大於 (>) 、小於 (<) 、大於或等於 (>=) ,或小於或等於 (<=) 比較算子。 而根據不等於 (<>) 運算子所執行的不相等連接,傳回的資料列數量可能與交叉連接同樣大量,有時難以解讀其結果。
我該如何使用不相等連接?
在 [設計] 檢視中不支援不相等聯結。 如果想要使用它們,您必須使用 SQL 檢視。 不過,你可以在設計檢視中建立連接,切換到 SQL 檢視,找到等值 (=) 比較運算子,然後改成你想用的運算子。 完成後,只有先把比較運算子改回 EQUALS (=) ,才能在設計檢視中再次開啟查詢。
刪除連接
如果 Access 自動建立你不想要的連接,或是你不小心建立的連接——例如兩個資料型別不同的欄位之間的連接——你可以刪除該連接。
- 在查詢設計格線中,按一下要移除的連接。
- 按下 DELETE。
-或-
- 在查詢設計格線中,以滑鼠右鍵按一下要移除的聯結,然後按一下 [刪除]。