程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> Access數據庫 >> 關於Access數據庫 >> Access 2007使用聯合查詢合並多個選擇查詢的結果

Access 2007使用聯合查詢合並多個選擇查詢的結果

編輯:關於Access數據庫

對於多個相似的選擇查詢,當您希望將它們返回的所有數據一起作為一個合並的集合查看時,便可以使用聯合查詢。

本文將向您介紹如何根據兩個或多個現有的選擇查詢創建聯合查詢,同時說明如何使用結構化查詢語言 (SQL) 編寫聯合查詢。

為完成本文中的示例,您應該對如何創建和運行選擇查詢有基本的了解。有關如何創建選擇查詢的詳細信息,請參閱請參閱部分中的鏈接。

本文內容

聯合查詢基礎知識

聯合查詢有哪些功能?

聯合查詢可合並多個相似的選擇查詢的結果集。

例如,假設您有兩個表,一個用於存儲有關客戶的信息,另一個用於存儲有關供應商的信息,並且這兩個表之間不存在任何關系。又假設這兩個表都有一些存儲聯系人信息的字段,而您希望同時查看這兩個表中的所有聯系人信息。

您可以為每個表都創建一個選擇查詢 (選擇查詢:就表中存儲的數據提出問題,然後在不更改數據的情況下以數據表的形式返回一個結果集。),以便只檢索包含聯系人信息的那些字段,但返回的信息仍將位於兩個單獨的位置。要將兩個或多個選擇查詢的結果合並到一個結果集中,可以使用聯合查詢。

聯合查詢的要求

聯合查詢中合並的選擇查詢必須具有相同的輸出字段數、采用相同的順序並包含相同或兼容的數據類型。在運行聯合查詢時,來自每組相應字段中的數據將合並到一個輸出字段中,這樣查詢輸出所包含的字段數將與每個 Select 語句相同。

 注釋   根據聯合查詢的目的,“數字”和“文本”數據類型兼容。

 

聯合查詢是特定於 SQL 的。特定於 SQL 的查詢不能在“設計”視圖中顯示,因此必須直接用 SQL 編寫。在 Microsoft Office Access 2007 中,您可以使用“SQL 視圖”對象選項卡編寫特定於 SQL 的查詢,包括聯合查詢。

 提示   每個查詢都可以用 SQL 語句來表達。此外,大多數查詢也可以在查詢設計網格 (設計網格:在查詢設計視圖或“高級篩選/排序”窗口中設計查詢或篩選時所用的網格。對於查詢,該網格以前稱為“QBE 網格”。)中表達,如果此環境可用,構建查詢將更加輕松。在使用設計網格創建查詢時,您始終都可以切換到 SQL 視圖,以查看運行查詢時所處理的 SQL 語句。在 SQL 視圖中查看查詢是一種很好的做法,因為您可以通過此途徑熟悉 SQL 並加深對查詢工作方式的理解。在某些情況下,您還可以使用 SQL 視圖對未返回預期結果的查詢進行故障排除。

聯合查詢的 SQL 語法

在聯合查詢中,每個選擇查詢(又稱為 Select 語句)都有一個 SELECT 子句和 FROM 子句,還可能有 WHERE 子句。SELECT 子句列出包含要檢索的數據的字段;FROM 子句列出包含這些字段的表;WHERE 子句則列出這些字段的條件。聯合查詢中的 Select 語句用 UNION 關鍵字組合在一起。

對於合並了兩個選擇查詢的聯合查詢,其基本 SQL 語法如下:

SELECT field_1[, field_2,…] FROM table_1[, table_2,…] UNION [ALL] SELECT field_a[, fIEld_b,...] FROM table_a[, table_b,…];

 

例如,假設您有兩個表,分別名為 Products 和 Services。這兩個表都具有包含下列內容的字段:產品或服務的名稱、價格、保修或擔保條款以及是否以獨占方式提供產品或服務。雖然 Products 表存儲了保修信息,而 Services 表存儲了擔保信息,但基本信息是相同的(即特定的產品或服務是否符合其質量承諾)。您可以使用聯合查詢將兩個表中的這四個字段合並在一起,例如:

SELECT name, price, warranty_available, exclusive_offer FROM Products UNION ALL SELECT name, price, guarantee_available, exclusive_offer FROM Services;

 

讓我們逐行檢查上面的語法示例。

  • SELECT name, price, warranty_available, exclusive_offer  這是一個 SELECT 子句,用於引入選擇查詢。SELECT 後面跟有一個標識符列表,用於指示要從中檢索數據的字段。SELECT 子句必須始終至少列出一個字段。此 SELECT 子句列出了字段標識符 namepricewarranty_availableexclusive_offer
  • FROM Products  這是一個 FROM 子句。FROM 子句跟在 SELECT 子句之後,二者共同構成了一個基本的 Select 語句。FROM 後也跟有一個標識符列表,用於指示哪些表包含 SELECT 子句中列出的字段。FROM 子句必須始終至少列出一個表。此 FROM 子句列出了表標識符 Products
  • UNION ALL  這是一個 UNION 關鍵字以及一個可選的 ALL 關鍵字。UNION 指示將 UNION 前後的 SELECT 語句的結果合並在一起。

    在使用 ALL 關鍵字時,Union 生成的合並集中並不刪除重復行。這樣,Access 便無需檢查重復行的結果,從而可以顯著提高查詢的性能。如果滿足下列任一條件,則應使用 ALL 關鍵字:

    • 您確定選擇查詢不會生成任何重復行。
    • 結果中是否存在重復行無關緊要。
    • 您希望查看重復行。

     

    在本示例中,我們使用 ALL 關鍵字是因為我們既不期望會返回重復行,也沒有略去它們的必要。

  • SELECT name, price, guarantee_available, exclusive_offer  這是第二個 SELECT 子句,用於引入聯合查詢中的第二個 SELECT 語句。在編寫聯合查詢時,各個 SELECT 語句中的字段必須相互對應,這意味著各個 SELECT 語句必須具有相同的字段數,並且共享通用數據的字段必須以相同的順序出現在子句中,同時這些字段必須具有相同或兼容的數據類型,如示例中所示。只有這些字段相互對應,才能在查詢輸出中將它們合並在一起。

     注釋   聯合查詢輸出中的字段名稱從第一個 SELECT 子句中提取。因此,在本示例的查詢輸出中,來自字段“warranty_available”和“guarantee_available”的數據將被命名為“warranty_available”。

  • FROM Services  這是第二個 FROM 子句,用於完成聯合查詢中的第二個 SELECT 語句。與 SELECT 子句中的字段不同,聯合查詢對 FROM 子句沒有表限制。您既可以創建在每個 FROM 子句中都使用相同的表的聯合查詢,也可以在 FROM 子句中使用不同數目的表。在我們的示例中,每個 FROM 子句都只有一個表。

 

創建聯合查詢

創建聯合查詢有兩種基本方法:

  • 先在查詢“設計”視圖 (設計視圖:顯示數據庫對象(包括:表、查詢、窗體、宏和數據訪問頁)的設計的窗口。在設計視圖中,可以新建數據庫對象和修改現有數據庫對象的設計。)中創建各個組件選擇查詢,然後將這些查詢合並為一個聯合查詢。
  • 直接在 SQL 視圖 (SQL 視圖:用於顯示當前查詢的 SQL 語句或用於創建 SQL 特有查詢(聯合查詢、傳遞查詢或數據定義查詢)的窗口。在設計視圖中創建查詢時,Access 會在 SQL 視圖中構建 SQL 的等價查詢。)中創建整個聯合查詢。

在大多數情況下,您都應該先創建選擇查詢,然後再將它們合並為一個聯合查詢。在 Office Access 2007 中,“設計”視圖提供了一種易用的創建選擇查詢的圖形用戶界面,您可以復制這些查詢的 SQL 語句並將它們粘貼到聯合查詢中。

但是,如果您認為編寫 SQL 語句得心應手,或者希望獲得更多的 SQL 編寫體驗,則可能更傾向於直接在 SQL 視圖中創建聯合查詢。


先在“設計”視圖中創建選擇查詢,然後合並它們

按照此方法,將先使用“設計”視圖創建每個選擇查詢,然後使用 SQL 視圖合並選擇查詢。

在“設計”視圖中創建每個選擇查詢

  1. “創建”選項卡上的“其他”組中,單擊“查詢設計”
  2. “顯示表”對話框中,雙擊要包括的字段所在的表。

    這會將該表添加到查詢設計窗口。

     注釋   雖然您可以在選擇查詢中包括多個表或查詢,但此過程假定每個選擇查詢只包括一個表中的數據。

  3. 關閉“顯示表”對話框。
  4. 在查詢設計窗口中,雙擊要包括的每個字段。

    選擇字段時,請確保您在其他選擇查詢中以相同順序添加了相同數目的字段。另外,請注意各個字段的數據類型,確保在要合並的其他查詢中,處於相應位置的字段具有兼容的數據類型。

    例如,如果第一個選擇查詢具有五個字段,且第一個字段包含“日期/時間”數據,請確保要合並的其他每個選擇查詢也具有五個字段,並且第一個字段同樣包含“日期/時間”數據,依此類推。

  5. 另外,您還可以在字段網格的“條件”行中鍵入適當的表達式 (表達式:算術或邏輯運算符、常數、函數和字段名稱、控件和屬性的任意組合,計算結果為單個值。表達式可執行計算、操作字符或測試數據。),以此向字段中添加條件。
  6. 在添加完字段和字段條件後,應運行選擇查詢並查看其輸出。
    • “設計”選項卡上的“結果”組中,單擊“運行”
  7. 將查詢切換到“設計”視圖。
  8. 保存該選擇查詢,但不要將其關閉。
  9. 對於要合並的每個選擇查詢,請重復此過程。

在 SQL 視圖中合並選擇查詢

  1. “創建”選項卡上的“其他”組中,單擊“查詢設計”

    在“設計”視圖中打開一個新查詢。

  2. 關閉“顯示表”對話框。
  3. “設計”選項卡上的“查詢”組中,單擊“聯合”

    將隱藏查詢設計窗口,並顯示 SQL 視圖對象選項卡。此時,SQL 視圖對象選項卡中沒有任何內容。

  4. 單擊要合並在聯合查詢中的第一個選擇查詢的選項卡。
  5. “開始”選項卡上的“視圖”組中,單擊“視圖”,然後單擊“SQL 視圖”

    將顯示該選擇查詢的 SQL 語句。

  6. 復制該選擇查詢的 SQL 語句。
  7. 單擊此過程在步驟 1 中開始創建的聯合查詢的選項卡。
  8. 將選擇查詢的 SQL 語句粘貼到聯合查詢的 SQL 視圖對象選項卡中。
  9. 刪除選擇查詢 SQL 語句末尾的分號 (;)。
  10. 按 Enter 將光標移到下一行,然後在新行中鍵入 UNION

    您也可以再在其後鍵入一個空格,跟著鍵入 ALL 關鍵字,然後再次按 Enter。

  11. 單擊要合並到聯合查詢中的下一個選擇查詢的選項卡。
  12. 請重復此過程的步驟 5 到步驟 11,直至將選擇查詢的所有 SQL 語句都通過復制和粘貼的方式添加到聯合查詢的 SQL 視圖窗口中。對於最後一個選擇查詢的 SQL 語句,請勿刪除其分號或鍵入任何內容。
  13. “設計”選項卡上的“結果”組中,單擊“運行”

    聯合查詢的結果將顯示在“數據表”視圖 (數據表視圖:以行列格式顯示來自表、窗體、查詢、視圖或存儲過程的窗口。在數據表視圖中,可以編輯字段、添加和刪除數據,以及搜索數據。)中。

直接在 SQL 視圖中創建聯合查詢

以下過程將引導您完成在 SQL 視圖中創建基本聯合查詢的步驟。

  1. “創建”選項卡上的“其他”組中,單擊“查詢設計”

    在“設計”視圖中打開一個新查詢。

  2. 關閉“顯示表”對話框。
  3. “設計”選項卡上的“查詢”組中,單擊“聯合”

    將隱藏查詢設計窗口,並顯示 SQL 視圖對象選項卡。此時,SQL 視圖對象選項卡中沒有任何內容。

  4. “SQL 視圖”對象選項卡中,鍵入 SELECT,然後鍵入要包括在查詢中的第一個或第一組表中的字段列表。請使用逗號將各個字段名稱隔開。在鍵入完字段名稱的列表後,請按 Enter。
  5. 鍵入 FROM,跟著鍵入包含上一個 SELECT 子句所列字段的表的名稱,然後按 Enter。
  6. 要為其中某個表中的字段指定條件,請鍵入 WHERE,跟著鍵入字段名稱、比較運算符(通常為等號 =)和條件。您還可以使用 AND 和 OR 關鍵字在 WHERE 子句的末尾添加其他條件。指定條件後,請按 Enter。
  7. 鍵入 UNION。如果您不希望查詢在輸出中刪除重復行,請鍵入一個空格,跟著鍵入 ALL 關鍵字,然後按 Enter。
  8. 鍵入 SELECT,跟著鍵入要包括在查詢中的下一個或下一組表中的字段列表。這些字段必須與第一個 SELECT 子句中包含的字段相對應且順序相同。請使用逗號將各個字段名稱隔開。在鍵入完字段名稱後,請按 Enter。
  9. 鍵入 FROM,跟著鍵入要包括在查詢中的下一個或下一組表的名稱,然後按 Enter。
  10. 要為其中某個表中的字段指定條件,請鍵入 WHERE,跟著鍵入字段名稱、比較運算符(通常為等號 =)和條件。您還可以使用 AND 關鍵字在 WHERE 子句的末尾添加其他條件。指定條件後,請按 Enter。
  11. 要在聯合查詢中包括其他 Select 語句,請重復步驟 7 到步驟 10。
  12. 請鍵入 ; 指示查詢的末尾。
  13. “設計”選項卡上的“結果”組中,單擊“運行”

    聯合查詢的結果將顯示在“數據表”視圖 (數據表視圖:以行列格式顯示來自表、窗體、查詢、視圖或存儲過程的窗口。在數據表視圖中,可以編輯字段、添加和刪除數據,以及搜索數據。)中。

 

使用聯合查詢的提示

  • 如果您希望能夠辨別各個行分別來自哪個表,可以在每個 Select 語句中添加一個文本字符串並將其用作一個字段。例如,如果有兩個 Select 語句,一個要檢索 Products 表中的字段,另一個則要檢索 Services 表中的字段,您可以在第一個語句的末尾將字符串“Product”添加為字段,而在第二個語句的末尾將“Service”添加為字段。此外,您還可以使用 AS 關鍵字向這些字符串分配字段別名(例如“type”),如下面的示例中所示:

     

    SELECT field1, fIEld2, ... "Product" AS type

     

     

    SELECT field1, fIEld2, ... "Service" AS type

     

    該查詢的輸出將包括一個名為“type”的字段,其中會顯示各個行是來自 Products 表,還是來自 Services 表。
  • 每個 UNION 關鍵字將合並緊跟在它前面和後面的 SELECT 語句。如果您只在查詢的部分 Union 關鍵字後使用了 ALL 關鍵字,則結果將包括由 UNION ALL 合並的 SELECT 語句對中的重復行,但不包括只用 UNION 而不用 ALL 關鍵字合並的 SELECT 語句中的重復行。
  • 對於要合並在聯合查詢中的選擇查詢,雖然其字段的數目、數據類型和順序都必須相對應,但如果出現不對應的情況,您也可以使用表達式(例如計算或子查詢)讓它們對應起來。例如,您可以讓兩個字符的年字段與四個字符的年字段匹配,方法是使用 Right 函數提取四個字符的年的後兩位數字。
  • 如果要使用某個聯合查詢的輸出創建一個新表,可以將該聯合查詢用作一個新選擇查詢的輸入,然後再將該選擇查詢用作生成表查詢 (生成表查詢:一種查詢(SQL 語句),它創建一個新表,然後通過從一個現有表中復制記錄,在新表中創建記錄(行)。)的基礎:
    •  

      1. 創建並保存該聯合查詢。
      2. “創建”選項卡上的“其他”組中,單擊“查詢設計”
      3. “顯示表”對話框中,單擊“查詢”選項卡。
      4. 雙擊該聯合查詢,然後關閉“顯示表”對話框。

         注釋   如果消息欄中顯示了安全警告,則說明可能禁用了生成表查詢等動作查詢。要允許動作查詢運行,請單擊消息欄上的“選項”,然後在“Microsoft Office 安全選項”中單擊“啟用此內容”

      5. 在查詢設計網格中,雙擊聯合查詢對象選項卡上的星號 (*),以使用聯合查詢的所有字段創建新表。

        -或-

        雙擊要在新表中使用的每個字段。

      6. “設計”選項卡上的“查詢類型”組中,單擊“生成表”
      7. “生成表”對話框中,為新表鍵入一個名稱。您還可以指定另一個數據庫來創建新表。完成後請單擊“確定”
      8. “設計”選項卡上的“結果”組中,單擊“運行”

       

  • 您可以使用聯合查詢執行完全外部聯接 (外部聯接:在這種聯接中,兩個表中的每條匹配記錄都在查詢結果中合並為一條記錄,並且其中一個表貢獻出它的所有記錄,即使聯接字段中的值與對方表中的字段不匹配也是如此。)。完全外部聯接並不限制從每個聯接表中返回的行,但會根據聯接字段中的值合並這些行。

    使用聯合查詢執行完全外部聯接:

    1. 在要用於完全外部聯接的字段上創建一個具有左外部聯接的查詢。
    2. “開始”選項卡上的“視圖”組中,單擊“視圖”,然後單擊“SQL 視圖”
    3. 按 Ctrl+C 復制 SQL 代碼。
    4. 刪除 FROM 子句末尾的分號,然後按 Enter。
    5. 鍵入 UNION,然後按 Enter。

       注釋   在使用聯合查詢執行完全外部聯接時,請勿使用 ALL 關鍵字。

    6. 按 Ctrl+V 粘貼您在步驟 3 中復制的 SQL 代碼。
    7. 在粘貼的代碼中,將 LEFT JOIN 更改為 RIGHT JOIN
    8. 刪除第二個 FROM 子句末尾的分號,然後按 Enter。
    9. 添加一個 WHERE 子句,將 FROM 子句中列出的第一個表(左表)中的聯接字段值更改為 NULL。

      例如,如果 FROM 子句為:

      FROM Products RIGHT JOIN [Order Details]   ON Products.ID = [Order Details].[Product ID]

       

      則應添加以下 WHERE 子句:

      WHERE Products.ID IS NULL

       

    10. 在 WHERE 子句的末尾鍵入一個分號 (;),以指示聯合查詢已達末尾。
    11. “設計”選項卡上的“結果”組中,單擊“運行”
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved