將查詢中的資料來源連接

當您在同一個查詢中加入多個資料來源時,可以根據各個資料來源之間的相互關係,來利用連接功能減少最終看到的記錄數量。連接也可以用來結合兩個資料來源的記錄,讓多個來源的每一組記錄都成為查詢結果中的單一筆記錄。

本文討論各種連接類型,並示範如何在查詢中使用連接。

附註: 本文的「資料表」一詞均指資料來源。在連接中使用資料表的地方可同樣改用查詢,作為資料來源。

概觀

內部聯結:聯結的資料表中若有相同值存在,則會顯示資料列

左方或右方外部聯結:顯示甲資料表所有資料列,以及乙資料表中相應的資料列

完整外部聯結:顯示雙方資料表的所有資料列,並且當有相同值存在時即結合該資料列

交叉聯結:資料列所有可能的組合

不相等聯結:根據欄位值不相等的條件來結合記錄

刪除聯結

概觀

連接之於查詢,就像關聯性之於資料表:連接表示兩個來源的資料如何根據共通的資料值來做結合。這裡有一張圖,顯示查詢 [設計檢視] 中的連接,以及在對話方塊中開啟的連接屬性:

[連接屬性] 對話方塊。

資料表之間的線條代表連接。連按兩下連接即可開啟 [連接屬性] 對話方塊 (如圖所示) 並檢閱或變更連接。

連接有時具有方向性。對話方塊的此區域顯示連接中哪些資料表代表甚麼,以及哪些欄位會用於連接資料表。

此區域指定連接類型:選項 1 是內部連接,選項 2 是左外部連接,選項 3 是右外部連接。

兩個資料表的欄位均可使用,並會顯示各資料表中與特定工作相關的資料。內部連接中不會加入其他資料。在外部連接中,查詢結果會包含其中一個表格裡不相關的資料。

有些連接是自動建立的。

在大多數情況下,您都不必特別考慮連接:若您加入查詢的資料表已有關聯關係,則 Acess 會建立內部連接來反映出這個關聯性。通常內部連接就是您所需的功能:確保從兩邊資料表抽出的資料能夠正確結合,讓每個資料表中的正確資料都會包含在查詢結果中,如此而已。但是有些時候,您會想要使用內容較廣泛的連接。

連接種類

連接基本上共有四種:內部連接、外部連接、交叉連接以及不相等連接。交叉連接及不相等連接是進階的連接類型,極少使用;但是為了完全理解連接的運作方式,您還是應該要知道這兩種類型。

內部連接:僅結合兩邊資料表的相關資料

內部連結即是 Access 僅會在相關資料表中含有對應資料時,才加入該資料表的資料,反之亦然。多數時候您都會使用內部連接。當您建立連接而不指定其類型時,Access 即假定您要建立內部連接。內部連接之所以有用,是因為您可以根據共通的值來結合兩個資料來源的資料:您只會在有完整資料時才會看到資料。

外部連接:所有關聯資料均正確結合,加上其中一個表格的其他所有記錄

外部連接跟內部連接一樣,只是加入了其中一個資料表剩餘的所有資料列。外部連接具有方向性:左外部連接會加入左資料表 (即連接中的第一個資料表) 的所有記錄,而右外部連接會加入右資料表 (即連接中的第二個資料表) 的所有記錄。

完整外部連接:所有資料,只要可行就會結合

有些系統的外部連接會包含兩個資料表中的所有資料列,並將相符的資料列結合。這就稱為完整外部連接,Access 並不直接支援此功能。不過,您可以利用交叉連接和準則來獲得相同效果。

交叉連接:所有資料,以所有可能的方式結合

大多數時候,交叉連接只是將兩個資料表加入查詢後,卻忘記連接資料表所造成的副作用。Access 將此舉視為是您要將資料表的每一筆記錄,與另一個資料表的每一筆記錄相結合,亦即所有可能的組合。因為不會結合資料,所以這種連接極少產生有用的結果。但還是有幾種您會需要用到交叉連接的狀況。

不相等連接:與一般的連接相同,只是使用不同的比較方式來結合資料列。

不相等連接是使用等號 (=) 以外的運算子來比較資料值,決定是否結合資料及其結合方式。Access 並未直接支援不相等連接,不過您可以利用交叉連接及準則方式來獲得相同效果。

頁面頂端

內部連接:連接的資料表中若有相同值存在,則會顯示資料列

若僅要顯示連接欄位中具有相符值的資料列,則應使用內部連接。Access 會自動建立內部連接。

內部連接是最常見的連接類型。內部連接會告訴查詢,其中一個連接的資料表中的資料列,根據連接欄位中之共通值,與另一個資料表中的資料列相對應。 執行一個含有內部連接的查詢時,只有在連接的兩個資料表中皆具有相同值的資料列會被加入查詢運算。

我該如何使用內部連接?

若要建立內部連接,請在查詢設計格線中,將其中一個資料來源的欄位拖放至另一個資料來源的欄位。Access 會將這兩個資料表連接,並在其中顯示一條線。

自動內部連接

大多數情況下,您不必做任何動作就可以使用內部連接。若您加入查詢的資料表已含有關聯關係,則在您加入資料表時,Access 會自動在每一組關聯資料表之間建立內部連接。若您強制執行參考完整性,則 Access 會在連接線上顯示 "1",標記哪一個資料表是處於一對多關聯性的「一」方,並在「多」方顯示無限符號 ()。

即使沒有建立關聯性,當您將兩個資料表加入查詢,而雙方均有相同名稱的欄位且資料類型相容時,只要其中一個欄位是其所屬資料表的主索引鍵,Access 就會自動建立內部連接。此情況下不會顯示「一」與「多」符號,因為參考完整性並未強制執行。

若您在查詢中新增查詢,且未在這些查詢間建立關聯性,則 Access 不會自動建立這些查詢之間,或是查詢與資料表之間的內部連接。一般而言,這些應該要手動建立 (意即將其中一個資料來源的欄位拖放至另一個資料來源的欄位上)。若不如此做,可能會產生交叉連接;當您並不想要交叉連接時,可能導致不正確的結果。

內部聯結的 SQL 語法

內部連接是以 SQL 的 FROM 子句指定,如下所示:

FROM table1 INNER JOIN table2 ON table1.field1compopr table2.field2

INNER JOIN 運算包含下列部分:

部分

描述

table1, table2

結合記錄的來源資料表名稱。

field1, field2

連接欄位的名稱。若非數值,則欄位必須是相同的資料類型,且儲存相同類型的資料,但名稱不必相同。

compopr

任何關聯性比較運算子:"="、"<"、">"、"<="、">=" 或 "<>"。

如需內部聯結語法的詳細資訊,請參閱內部聯結運算主題。

頁面頂端

左或右外部連接:顯示甲資料表所有資料列,以及乙資料表中相應的資料列

外部連接會告訴查詢作業,雖然連接的兩端有部分資料列能夠完全對應,但查詢應該包含其中一個資料表的所有資料列,以及另一個資料表中在連接的兩端都有共通值的資料列。

外部連接又可分為左外部連接與右外部連接。在左外部連接,查詢會加入 SQL 敘述的 FROM 子句中所列的第一個資料表所有資料列,然後僅將另一個資料列中,連接欄位在雙方資料表均有相同值的資料列加入結果。在右外部連接,查詢會加入 SQL 敘述的 FROM 子句中所列的第二個資料表所有資料列,然後僅將另一個資料列中,連接欄位在雙方資料表均有相同值的資料列加入結果。

附註: 在任何聯結中,只要連按兩下聯結查看 [連結屬性] 對話方塊,即可輕易確認哪一個資料表是左資料表,哪一個是右資料表。或者,在 SQL 檢視下查看連接詳細資料中的 FROM 子句。

由於外部連接其中一端的部分資料列在另一個資料表中沒有對應的資料列,所以當資料列無法對應時,從另一個資料表傳回的查詢結果中會有一些空的欄位。

我該如何使用外部連接?

要建立外部連接時,請修改現有的內部連接。若沒有內部連接存在,請建立一個,然後再將其變更為外部連接。

將內部連接變更為外部連接

  1. 在查詢 [設計檢視] 中,按兩下要變更的連接。

    [Join 屬性] 對話方塊即會出現。

  2. [Join 屬性] 對話方塊中,注意選項 [2] 及選項 [3] 旁邊所列的選擇。

  3. 按一下您要使用的選項,然後按一下 [確定]

  4. Access 會顯示連接並且顯示一個箭頭,從要包含其所有資料列的資料來源指向只有包含滿足連接條件之資料列的資料來源。

不明確的外部連接

若您建立的查詢含有一個 LEFT JOIN (左連接) 以及一個 INNER JOIN (內部連接),則 Access 可能無法判斷應該先執行哪一個運算。因為先執行左連接或先執行內部連接所得到的結果不同,所以 Access 會顯示錯誤訊息,指出有不明確的外部連接。

要修正此錯誤,請修改查詢,明確指示哪一個連接應該先執行。

外部連接及查詢可更新性

在 Access 應用程式中,查詢多個資料表時,其欄位僅在以下條件為真時,才可進行更新:

  • 該欄位來自查詢中的「最多-多數」資料表,亦即該資料表會在另一個資料表中查詢資料。

  • 查詢輸出包含最多-多數資料表的主索引鍵。

  • 若最多-多數資料表是外部連接的一部分,則該資料表即是位於連接的內部側:此資料表會是左外部連接中的左資料表,或右外部連接的右資料表。

若以上任何條件不為真,則該欄位即是唯讀,不論是在查詢資料工作表,還是在任何以該查詢為基礎的檢視中都是如此。

外部聯結的 SQL 語法

外部連接是以 SQL 的 FROM 子句指定,如下所示:

FROM table1 [ LEFT | RIGHT ] JOIN table2
ON table1.field1compopr table2.field2

LEFT JOIN 與 RIGHT JOIN 運算由下列參數組成:

部分

描述

table1, table2

結合記錄的來源資料表名稱。

field1, field2

連接欄位的名稱。欄位必須有相同資料類型且含有相同種類的資料,但是不必有相同名稱。

compopr

任何關聯性比較運算子:"="、"<"、">"、"<="、">=" 或 "<>"。

如需外部聯結語法的詳細資訊,請參閱左方聯結與右方聯結運算主題。

頁面頂端

完整外部連接:顯示雙方資料表的所有資料列,並且當有相同值存在時即結合該資料列

當您想要顯示兩個資料表的所有資料列,並依共通值將其結合時,請使用完整外部連接。Access 並不直接支援完整外部連接,但您可以利用交叉連接與準則達成相同效果。

  1. 建立查詢,並加入兩個資料表。若 Access 自動建立任何連接,請將其刪除。

  2. 加入您要在查詢結果中輸出的任何欄位。

  3. 從兩個資料表新增連接欄位,並且清除 [顯示] 列的核取方塊。

  4. 在查詢設計格線中,第一個資料表的連接欄位下的 [準則] 列中,輸入第二個資料表的連接欄位。若連接欄位的名稱相同,請記得在輸入參照時加入資料表名稱。

  5. 在剛輸入的準則下的 [或] 資料列,輸入 Is Null

  6. 在下一個 [或] 資料列 (第一個的下面),於第二個資料表的連接欄位中輸入 Is Null

此查詢會傳回以下結合結果:

  • 連接欄位值相符的資料列,據此結合的資料 (效果同內部連接)

  • 第一個資料表連接欄位中沒有值的資料列 (效果同左外部連接的外側)

  • 第二個資料表連接欄位中沒有值的資料列 (效果同右外部連接的外側)

頁面頂端

交叉連接:資料列所有可能的組合

只要在查詢中加入資料表而不進行連接,就會產生交叉連接。Access 會將其中一個資料表的每一列資料,與另一個資料表的每一列資料結合,產生所謂的交叉乘積,或稱「笛卡兒乘積」。通常這不會是您要的結果,但是交叉連接有時適合拿來探索假設性的問題。

為什麼要使用交叉連接?

若您要查看兩個資料表或查詢之間所有可能的資料列組合,請使用交叉查詢。假設公司今年的銷售成績非常亮眼,您考慮要提供現金回饋給客戶。您可以建置一個查詢,加總每一位客戶的購買額,再建立一個小資料表設定數種可能的回饋百分比,再於另一個查詢中結合兩個資料表,執行交叉查詢。這個交叉乘積就會為每一位客戶顯示各種不同的回饋比 – 這正是您所需要的。

我該如何使用交叉連接?

將兩個資料表加入查詢中,不在資料表之間建立連接,並在查詢結果中包含雙方的欄位。Access 會在查詢結果中,將兩個資料表或查詢內,未明確連接至其他任何資料表或查詢的每一列,都結合到其他每一列。承前段中所提的現金回饋範例。假設您有 91 位客戶,考慮採用的回饋比有五種。交叉連接的結果會有 455 列 (91 乘以 5)。

若您加入的資料表之間有關聯性,Access 會自動建立內部連接。您可以視需求將此自動連接刪除,以產生交叉連接。

如您所見,非刻意執行的交叉連接可能會在查詢結果中產生大量的資料列。不但如此,這些資料列通常毫無意義,因為資料列不是根據共通的資料結合,故此組合也不會有相對應的意義。

頁面頂端

不相等連接:根據欄位值不相等的條件來結合記錄

連接並不一定要根據連接欄位的相等性。連接可以是根據任何比較運算子進行,例如大於 (>)、小於 (<) 或不等於 (<>)。不是根據相等性的連接,稱為不相等連接。

若您要根據不相等的欄位值來結合兩個資料來源的資料列,請使用不相等連接。通常來說,不相等連接是依據大於 (>)、小於 (<)、大於等於 (>=) 或是小於等於 (<=) 比較運算子來進行。而根據不等於 (<>) 運算子所執行的不相等連接,傳回的資料列數量可能與交叉連接同樣大量,有時難以解讀其結果。

我該如何使用不相等連接?

Access 並不在 [設計檢視] 中直接支援不相等連接,但您可以利用交叉連接及準則來達成相同效果:

  1. 建立查詢,並將不相等連接所要使用的兩個資料表加入。若 Access 自動建立任何連接,請將其刪除。

  2. 加入任何您要使用的輸出欄位。

  3. 從第一個資料表加入連接欄位,並清除 [顯示] 資料列中的核取方塊。

  4. [準則] 資料列中輸入您要使用的非相等運算子,然後輸入第二個資料表的連接欄位。

此查詢會根據您所指定的非相等運算子結合兩個資料表的資料列,再將結果傳回。

頁面頂端

刪除連接

若 Access 自動建立您不想使用的連接,或是您建立了錯誤的連接 (例如連接兩個具有類似資料類型的欄位時),您可以直接刪除連接。

  1. 在查詢設計格線中,按一下要移除的連接。

  2. 按下 DELETE

-或-

  • 在查詢設計格線中,以滑鼠右鍵按一下要移除的聯結,然後按一下 [刪除]

頁面頂端

擴展您的技能
探索訓練
優先取得新功能
加入 Office 測試人員

這項資訊有幫助嗎?

感謝您的意見反應!

感謝您的意見反應! 我們將協助您與其中一位 Office 支援專員連絡以深入了解您的意見。

×