Access > 查詢
使用聯(lián)合查詢合并多個(gè)選擇查詢的結(jié)果
全部顯示
全部隱藏
對(duì)于多個(gè)相似的選擇查詢,當(dāng)您希望將它們返回的所有數(shù)據(jù)一起作為一個(gè)合并的集合查看時(shí),便可以使用聯(lián)合查詢。
本文將向您介紹如何根據(jù)兩個(gè)或多個(gè)現(xiàn)有的選擇查詢創(chuàng)建聯(lián)合查詢,同時(shí)說(shuō)明如何使用結(jié)構(gòu)化查詢語(yǔ)言 (SQL) 編寫(xiě)聯(lián)合查詢。
為完成本文中的示例,您應(yīng)該對(duì)如何創(chuàng)建和運(yùn)行選擇查詢有基本的了解。有關(guān)創(chuàng)建選擇查詢的詳細(xì)信息,請(qǐng)參閱“請(qǐng)參閱”部分。
本文內(nèi)容
概述
創(chuàng)建聯(lián)合查詢
有關(guān)使用聯(lián)合查詢的提示
概述
聯(lián)合查詢有哪些功能?
聯(lián)合查詢可合并多個(gè)相似的選擇查詢的結(jié)果集。
例如,假設(shè)您有兩個(gè)表,一個(gè)用于存儲(chǔ)有關(guān)客戶的信息,另一個(gè)用于存儲(chǔ)有關(guān)供應(yīng)商的信息,并且這兩個(gè)表之間不存在任何關(guān)系。又假設(shè)這兩個(gè)表都有一些存儲(chǔ)聯(lián)系人信息的字段,而您希望同時(shí)查看這兩個(gè)表中的所有聯(lián)系人信息。
您可以為每個(gè)表都創(chuàng)建一個(gè)選擇查詢 (選擇查詢:就表中存儲(chǔ)的數(shù)據(jù)提出問(wèn)題,然后在不更改數(shù)據(jù)的情況下以數(shù)據(jù)表的形式返回一個(gè)結(jié)果集。),以便只檢索包含聯(lián)系人信息的那些字段,但返回的信息仍將位于兩個(gè)單獨(dú)的位置。要將兩個(gè)或多個(gè)選擇查詢的結(jié)果合并到一個(gè)結(jié)果集中,可以使用聯(lián)合查詢。
聯(lián)合查詢的要求
聯(lián)合查詢中合并的選擇查詢必須具有相同的輸出字段數(shù)、采用相同的順序并包含相同或兼容的數(shù)據(jù)類型。在運(yùn)行聯(lián)合查詢時(shí),來(lái)自每組相應(yīng)字段中的數(shù)據(jù)將合并到一個(gè)輸出字段中,這樣查詢輸出所包含的字段數(shù)將與每個(gè) Select 語(yǔ)句相同。
注釋 根據(jù)聯(lián)合查詢的目的,“數(shù)字”和“文本”數(shù)據(jù)類型兼容。
聯(lián)合查詢是特定于 SQL 的。特定于 SQL 的查詢不能在“設(shè)計(jì)”視圖中顯示,因此必須直接用 SQL 編寫(xiě)。在 Microsoft Office Access 2007 中,您可以使用“SQL 視圖”對(duì)象選項(xiàng)卡編寫(xiě)特定于 SQL 的查詢,包括聯(lián)合查詢。
提示 每個(gè)查詢都可以用 SQL 語(yǔ)句來(lái)表達(dá)。此外,大多數(shù)查詢也可以在查詢設(shè)計(jì)網(wǎng)格 (設(shè)計(jì)網(wǎng)格:在查詢?cè)O(shè)計(jì)視圖或“高級(jí)篩選/排序”窗口中設(shè)計(jì)查詢或篩選時(shí)所用的網(wǎng)格。對(duì)于查詢,該網(wǎng)格以前稱為“QBE 網(wǎng)格”。)中表達(dá),如果此環(huán)境可用,構(gòu)建查詢將更加輕松。在使用設(shè)計(jì)網(wǎng)格創(chuàng)建查詢時(shí),您始終都可以切換到 SQL 視圖,以查看運(yùn)行查詢時(shí)所處理的 SQL 語(yǔ)句。在 SQL 視圖中查看查詢是一種很好的做法,因?yàn)槟梢酝ㄟ^(guò)此途徑熟悉 SQL 并加深對(duì)查詢工作方式的理解。在某些情況下,您還可以使用 SQL 視圖對(duì)未返回預(yù)期結(jié)果的查詢進(jìn)行故障排除。
聯(lián)合查詢的 SQL 語(yǔ)法
在聯(lián)合查詢中,每個(gè)選擇查詢(又稱為 Select 語(yǔ)句)都有一個(gè) SELECT 子句和 FROM 子句,還可能有 WHERE 子句。SELECT 子句列出包含要檢索的數(shù)據(jù)的字段;FROM 子句列出包含這些字段的表;WHERE 子句則列出這些字段的條件。聯(lián)合查詢中的 Select 語(yǔ)句用 UNION 關(guān)鍵字組合在一起。
對(duì)于合并了兩個(gè)選擇查詢的聯(lián)合查詢,其基本 SQL 語(yǔ)法如下:
SELECT field_1[, field_2,…]
FROM table_1[, table_2,…]
UNION [ALL]
SELECT field_a[, field_b,...]
FROM table_a[, table_b,…];
例如,假設(shè)您有兩個(gè)表,分別名為 Products 和 Services。這兩個(gè)表都具有包含下列內(nèi)容的字段:產(chǎn)品或服務(wù)的名稱、價(jià)格、保修或擔(dān)保條款以及是否以獨(dú)占方式提供產(chǎn)品或服務(wù)。雖然 Products 表存儲(chǔ)了保修信息,而 Services 表存儲(chǔ)了擔(dān)保信息,但基本信息是相同的(即特定的產(chǎn)品或服務(wù)是否符合其質(zhì)量承諾)。您可以使用聯(lián)合查詢將兩個(gè)表中的這四個(gè)字段合并在一起,例如:
SELECT name, price, warranty_available, exclusive_offer
FROM Products
UNION ALL
SELECT name, price, guarantee_available, exclusive_offer
FROM Services;
讓我們逐行檢查上面的語(yǔ)法示例。
✍ | SELECT name, price, warranty_available, exclusive_offer 這是一個(gè) SELECT 子句,用于引入選擇查詢。SELECT 后面跟有一個(gè)標(biāo)識(shí)符列表,用于指示要從中檢索數(shù)據(jù)的字段。SELECT 子句必須始終至少列出一個(gè)字段。此 SELECT 子句列出了字段標(biāo)識(shí)符 name、price、warranty_available 和 exclusive_offer。 |
✍ | FROM Products 這是一個(gè) FROM 子句。FROM 子句跟在 SELECT 子句之后,二者共同構(gòu)成了一個(gè)基本的 Select 語(yǔ)句。FROM 后也跟有一個(gè)標(biāo)識(shí)符列表,用于指示哪些表包含 SELECT 子句中列出的字段。FROM 子句必須始終至少列出一個(gè)表。此 FROM 子句列出了表標(biāo)識(shí)符 Products。 |
✍ | UNION ALL 這是一個(gè) UNION 關(guān)鍵字以及一個(gè)可選的 ALL 關(guān)鍵字。UNION 指示將 UNION 前后的 SELECT 語(yǔ)句的結(jié)果合并在一起。 |
在使用 ALL 關(guān)鍵字時(shí),Union 生成的合并集中并不刪除重復(fù)行。這樣,Access 便無(wú)需檢查重復(fù)行的結(jié)果,從而可以顯著提高查詢的性能。如果滿足下列任一條件,則應(yīng)使用 ALL 關(guān)鍵字:
✍ | 您確定選擇查詢不會(huì)生成任何重復(fù)行。 |
✍ | 結(jié)果中是否存在重復(fù)行無(wú)關(guān)緊要。 |
在本示例中,我們使用 ALL 關(guān)鍵字是因?yàn)槲覀兗炔黄谕麜?huì)返回重復(fù)行,也沒(méi)有略去它們的必要。
✍ | SELECT name, price, guarantee_available, exclusive_offer 這是第二個(gè) SELECT 子句,用于引入聯(lián)合查詢中的第二個(gè) SELECT 語(yǔ)句。在編寫(xiě)聯(lián)合查詢時(shí),各個(gè) SELECT 語(yǔ)句中的字段必須相互對(duì)應(yīng),這意味著各個(gè) SELECT 語(yǔ)句必須具有相同的字段數(shù),并且共享通用數(shù)據(jù)的字段必須以相同的順序出現(xiàn)在子句中,同時(shí)這些字段必須具有相同或兼容的數(shù)據(jù)類型,如示例中所示。只有這些字段相互對(duì)應(yīng),才能在查詢輸出中將它們合并在一起。 |
注釋 聯(lián)合查詢輸出中的字段名稱從第一個(gè) SELECT 子句中提取。因此,在本示例的查詢輸出中,來(lái)自字段“warranty_available”和“guarantee_available”的數(shù)據(jù)將被命名為“warranty_available”。
✍ | FROM Services 這是第二個(gè) FROM 子句,用于完成聯(lián)合查詢中的第二個(gè) SELECT 語(yǔ)句。與 SELECT 子句中的字段不同,聯(lián)合查詢對(duì) FROM 子句沒(méi)有表限制。您既可以創(chuàng)建在每個(gè) FROM 子句中都使用相同的表的聯(lián)合查詢, 也可以在 FROM 子句中使用不同數(shù)目的表。在我們的示例中,每個(gè) FROM 子句都只有一個(gè)表。 |
返回頁(yè)首
創(chuàng)建聯(lián)合查詢
創(chuàng)建聯(lián)合查詢有兩種基本方法:
在大多數(shù)情況下,您都應(yīng)該先創(chuàng)建選擇查詢,然后再將它們合并為一個(gè)聯(lián)合查詢。在 Office Access 2007 中,“設(shè)計(jì)”視圖提供了一種易用的創(chuàng)建選擇查詢的圖形用戶界面,您可以復(fù)制這些查詢的 SQL 語(yǔ)句并將它們粘貼到聯(lián)合查詢中。
但是,如果您認(rèn)為編寫(xiě) SQL 語(yǔ)句得心應(yīng)手,或者希望獲得更多的 SQL 編寫(xiě)體驗(yàn),則可能更傾向于直接在 SQL 視圖中創(chuàng)建聯(lián)合查詢。
您要做什么?
先在“設(shè)計(jì)”視圖中創(chuàng)建選擇查詢,然后合并它們
直接在 SQL 視圖中創(chuàng)建聯(lián)合查詢
先在“設(shè)計(jì)”視圖中創(chuàng)建選擇查詢,然后合并它們
按照此方法,將先使用“設(shè)計(jì)”視圖創(chuàng)建每個(gè)選擇查詢,然后使用 SQL 視圖合并選擇查詢。
在“設(shè)計(jì)”視圖中創(chuàng)建每個(gè)選擇查詢
1. | 在“創(chuàng)建”選項(xiàng)卡上的“其他”組中,單擊“查詢?cè)O(shè)計(jì)”。 |
2. | 在“顯示表”對(duì)話框中,雙擊要包括的字段所在的表。 |
這會(huì)將該表添加到查詢?cè)O(shè)計(jì)窗口。
注釋 雖然您可以在選擇查詢中包括多個(gè)表或查詢,但此過(guò)程假定每個(gè)選擇查詢只包括一個(gè)表中的數(shù)據(jù)。
4. | 在查詢?cè)O(shè)計(jì)窗口中,雙擊要包括的每個(gè)字段。 |
選擇字段時(shí),請(qǐng)確保您在其他選擇查詢中以相同順序添加了相同數(shù)目的字段。另外,請(qǐng)注意各個(gè)字段的數(shù)據(jù)類型,確保在要合并的其他查詢中,處于相應(yīng)位置的字段具有兼容的數(shù)據(jù)類型。
例如,如果第一個(gè)選擇查詢具有五個(gè)字段,且第一個(gè)字段包含“日期/時(shí)間”數(shù)據(jù),請(qǐng)確保要合并的其他每個(gè)選擇查詢也具有五個(gè)字段,并且第一個(gè)字段同樣包含“日期/時(shí)間”數(shù)據(jù),依此類推。
6. | 在添加完字段和字段條件后,應(yīng)運(yùn)行選擇查詢并查看其輸出。 |
✍ | 在“設(shè)計(jì)”選項(xiàng)卡上的“結(jié)果”組中,單擊“運(yùn)行”。 |
9. | 對(duì)于要合并的每個(gè)選擇查詢,請(qǐng)重復(fù)此過(guò)程。 |
在 SQL 視圖中合并選擇查詢
1. | 在“創(chuàng)建”選項(xiàng)卡上的“其他”組中,單擊“查詢?cè)O(shè)計(jì)”。 |
在“設(shè)計(jì)”視圖中打開(kāi)一個(gè)新查詢。
3. | 在“設(shè)計(jì)”選項(xiàng)卡上的“查詢”組中,單擊“聯(lián)合”。 |
將隱藏查詢?cè)O(shè)計(jì)窗口,并顯示 SQL 視圖對(duì)象選項(xiàng)卡。此時(shí),SQL 視圖對(duì)象選項(xiàng)卡中沒(méi)有任何內(nèi)容。
4. | 單擊要合并在聯(lián)合查詢中的第一個(gè)選擇查詢的選項(xiàng)卡。 |
5. | 在“開(kāi)始”選項(xiàng)卡上的“視圖”組中,單擊“視圖”,然后單擊“SQL 視圖”。 |
將顯示該選擇查詢的 SQL 語(yǔ)句。
6. | 復(fù)制該選擇查詢的 SQL 語(yǔ)句。 |
7. | 單擊此過(guò)程在步驟 1 中開(kāi)始創(chuàng)建的聯(lián)合查詢的選項(xiàng)卡。 |
8. | 將選擇查詢的 SQL 語(yǔ)句粘貼到聯(lián)合查詢的 SQL 視圖對(duì)象選項(xiàng)卡中。 |
9. | 刪除選擇查詢 SQL 語(yǔ)句末尾的分號(hào) (;)。 |
10. | 按 Enter 將光標(biāo)移到下一行,然后在新行中鍵入 UNION。 |
您也可以再在其后鍵入一個(gè)空格,跟著鍵入 ALL 關(guān)鍵字,然后再次按 Enter。
11. | 單擊要合并到聯(lián)合查詢中的下一個(gè)選擇查詢的選項(xiàng)卡。 |
12. | 請(qǐng)重復(fù)此過(guò)程的步驟 5 到步驟 11,直至將選擇查詢的所有 SQL 語(yǔ)句都通過(guò)復(fù)制和粘貼的方式添加到聯(lián)合查詢的 SQL 視圖窗口中。對(duì)于最后一個(gè)選擇查詢的 SQL 語(yǔ)句,請(qǐng)勿刪除其分號(hào)或鍵入任何內(nèi)容。 |
13. | 在“設(shè)計(jì)”選項(xiàng)卡上的“結(jié)果”組中,單擊“運(yùn)行”。 |
聯(lián)合查詢的結(jié)果將顯示在“數(shù)據(jù)表”視圖 (數(shù)據(jù)表視圖:以行列格式顯示來(lái)自表、窗體、查詢、視圖或存儲(chǔ)過(guò)程中的數(shù)據(jù)的視圖。在數(shù)據(jù)表視圖中,可以編輯字段、添加和刪除數(shù)據(jù),以及搜索數(shù)據(jù)。)中。
直接在 SQL 視圖中創(chuàng)建聯(lián)合查詢
以下過(guò)程將引導(dǎo)您完成在 SQL 視圖中創(chuàng)建基本聯(lián)合查詢的步驟。
1. | 在“創(chuàng)建”選項(xiàng)卡上的“其他”組中,單擊“查詢?cè)O(shè)計(jì)”。 |
在“設(shè)計(jì)”視圖中打開(kāi)一個(gè)新查詢。
3. | 在“設(shè)計(jì)”選項(xiàng)卡上的“查詢”組中,單擊“聯(lián)合”。 |
將隱藏查詢?cè)O(shè)計(jì)窗口,并顯示 SQL 視圖對(duì)象選項(xiàng)卡。此時(shí),SQL 視圖對(duì)象選項(xiàng)卡中沒(méi)有任何內(nèi)容。
4. | 在“SQL 視圖”對(duì)象選項(xiàng)卡中,鍵入 SELECT,然后鍵入要包括在查詢中的第一個(gè)或第一組表中的字段列表。請(qǐng)使用逗號(hào)將各個(gè)字段名稱隔開(kāi)。在鍵入完字段名稱的列表后,請(qǐng)按 Enter。 |
5. | 鍵入 FROM,跟著鍵入包含上一個(gè) SELECT 子句所列字段的表的名稱,然后按 Enter。 |
6. | 若要為這些表中的某個(gè)表的字段指定條件,請(qǐng)鍵入 WHERE,跟著鍵入字段名、比較運(yùn)算符(通常為等號(hào) (=))和條件。您還可以使用 AND 和 OR 關(guān)鍵字在 WHERE 子句的末尾添加其他條件。指定條件后,請(qǐng)按 Enter。 |
7. | 鍵入 UNION。如果您不希望查詢?cè)谳敵鲋袆h除重復(fù)行,請(qǐng)鍵入一個(gè)空格,跟著鍵入 ALL 關(guān)鍵字,然后按 Enter。 |
8. | 鍵入 SELECT,跟著鍵入要包括在查詢中的下一個(gè)或下一組表中的字段列表。這些字段必須與第一個(gè) SELECT 子句中包含的字段相對(duì)應(yīng)且順序相同。請(qǐng)使用逗號(hào)將各個(gè)字段名稱隔開(kāi)。在鍵入完字段名稱后,請(qǐng)按 Enter。 |
9. | 鍵入 FROM,跟著鍵入要包括在查詢中的下一個(gè)或下一組表的名稱,然后按 Enter。 |
10. | 若要為這些表中的某個(gè)表的字段指定條件,請(qǐng)鍵入 WHERE,跟著鍵入字段名、比較運(yùn)算符(通常為等號(hào) (=))和條件。您還可以使用 AND 關(guān)鍵字在 WHERE 子句的末尾添加其他條件。指定條件后,請(qǐng)按 Enter。 |
11. | 要在聯(lián)合查詢中包括其他 Select 語(yǔ)句,請(qǐng)重復(fù)步驟 7 到步驟 10。 |
13. | 在“設(shè)計(jì)”選項(xiàng)卡上的“結(jié)果”組中,單擊“運(yùn)行”。 |
聯(lián)合查詢的結(jié)果將顯示在“數(shù)據(jù)表”視圖 (數(shù)據(jù)表視圖:以行列格式顯示來(lái)自表、窗體、查詢、視圖或存儲(chǔ)過(guò)程中的數(shù)據(jù)的視圖。在數(shù)據(jù)表視圖中,可以編輯字段、添加和刪除數(shù)據(jù),以及搜索數(shù)據(jù)。)中。
返回頁(yè)首
使用聯(lián)合查詢的提示
✍ | 如果您希望能夠辨別各個(gè)行分別來(lái)自哪個(gè)表,可以在每個(gè) Select 語(yǔ)句中添加一個(gè)文本字符串并將其用作一個(gè)字段。例如,如果有兩個(gè) Select 語(yǔ)句,一個(gè)要檢索 Products 表中的字段,另一個(gè)則要檢索 Services 表中的字段,您可以在第一個(gè)語(yǔ)句的末尾將字符串“Product”添加為字段,而在第二個(gè)語(yǔ)句的末尾將“Service”添加為字段。此外,您還可以使用 AS 關(guān)鍵字向這些字符串分配字段別名(例如“type”),如下面的示例中所示: |
SELECT field1, field2, ... "Product" AS type
SELECT field1, field2, ... "Service" AS type
該查詢的輸出將包括一個(gè)名為“type”的字段,其中會(huì)顯示各個(gè)行是來(lái)自 Products 表,還是來(lái)自 Services 表。
✍ | 每個(gè) UNION 關(guān)鍵字將合并緊跟在它前面和后面的 SELECT 語(yǔ)句。如果您只在查詢的部分 Union 關(guān)鍵字后使用了 ALL 關(guān)鍵字,則結(jié)果將包括由 UNION ALL 合并的 SELECT 語(yǔ)句對(duì)中的重復(fù)行,但不包括只用 UNION 而不用 ALL 關(guān)鍵字合并的 SELECT 語(yǔ)句中的重復(fù)行。 |
✍ | 對(duì)于要合并在聯(lián)合查詢中的選擇查詢,雖然其字段的數(shù)目、數(shù)據(jù)類型和順序都必須相對(duì)應(yīng),但如果出現(xiàn)不對(duì)應(yīng)的情況,您也可以使用表達(dá)式(例如計(jì)算或子查詢)讓它們對(duì)應(yīng)起來(lái)。例如,您可以讓兩個(gè)字符的年字段與四個(gè)字符的年字段匹配,方法是使用 Right 函數(shù)提取四個(gè)字符的年的后兩位數(shù)字。 |
2. | 創(chuàng)建并保存該聯(lián)合查詢。 |
3. | 在“創(chuàng)建”選項(xiàng)卡上的“其他”組中,單擊“查詢?cè)O(shè)計(jì)”。 |
4. | 在“顯示表”對(duì)話框中,單擊“查詢”選項(xiàng)卡。 |
5. | 雙擊該聯(lián)合查詢,然后關(guān)閉“顯示表”對(duì)話框。 |
注釋 如果消息欄中顯示了安全警告,則說(shuō)明可能禁用了生成表查詢等動(dòng)作查詢。要允許動(dòng)作查詢運(yùn)行,請(qǐng)單擊消息欄上的“選項(xiàng)”,然后在“Microsoft Office 安全選項(xiàng)”中單擊“啟用此內(nèi)容”。
6. | 在查詢?cè)O(shè)計(jì)網(wǎng)格中,雙擊聯(lián)合查詢對(duì)象選項(xiàng)卡上的星號(hào) (*),以使用聯(lián)合查詢的所有字段創(chuàng)建新表。 |
- 或 -
雙擊要在新表中使用的每個(gè)字段。
7. | 在“設(shè)計(jì)”選項(xiàng)卡上的“查詢類型”組中,單擊“生成表”。 |
8. | 在“生成表”對(duì)話框中,為新表鍵入一個(gè)名稱。您還可以指定另一個(gè)數(shù)據(jù)庫(kù)來(lái)創(chuàng)建新表。完成后請(qǐng)單擊“確定”。 |
9. | 在“設(shè)計(jì)”選項(xiàng)卡上的“結(jié)果”組中,單擊“運(yùn)行”。 |
使用聯(lián)合查詢執(zhí)行完全外部聯(lián)接:
| 在要用于完全外部聯(lián)接的字段上創(chuàng)建一個(gè)具有左外部聯(lián)接的查詢。 |
| 在“開(kāi)始”選項(xiàng)卡上的“視圖”組中,單擊“視圖”,然后單擊“SQL 視圖”。 |
| 刪除 FROM 子句末尾的分號(hào),然后按 Enter。 |
注釋 在使用聯(lián)合查詢執(zhí)行完全外部聯(lián)接時(shí),請(qǐng)勿使用 ALL 關(guān)鍵字。
| 按 Ctrl+V 粘貼您在步驟 3 中復(fù)制的 SQL 代碼。 |
| 在粘貼的代碼中,將 LEFT JOIN 更改為 RIGHT JOIN。 |
| 刪除第二個(gè) FROM 子句末尾的分號(hào),然后按 Enter。 |
| 添加一個(gè) WHERE 子句,將 FROM 子句中列出的第一個(gè)表(左表)中的聯(lián)接字段值更改為 NULL。 |
例如,如果 FROM 子句為:
FROM Products RIGHT JOIN [Order Details]
ON Products.ID = [Order Details].[Product ID]
則應(yīng)添加以下 WHERE 子句:
WHERE Products.ID IS NULL
| 在 WHERE 子句的末尾鍵入一個(gè)分號(hào) (;),以指示聯(lián)合查詢已達(dá)末尾。 |
| 在“設(shè)計(jì)”選項(xiàng)卡上的“結(jié)果”組中,單擊“運(yùn)行”。 |
返回頁(yè)首