有時你可能想將一個資料表的紀錄或查詢,與一個或多個其他資料表的紀錄合併成單一結果。 這就是 Access 裡 union 查詢的功能。
為了有效率地了解聯集查詢,建議您先熟悉如何在 Access 中設計基本選取查詢。 若要深入了解基本選取查詢,請參閱建立簡單的選取查詢 (機器翻譯)。
研究運用聯集查詢的範例
如果你從未建立過 union 查詢,建議先研究 Northwind Access 範本中的一個工作範例。 你可以在 Access 的入門頁面選擇「新檔案>」來搜尋 Northwind 範例範本。 你也可以直接從 Northwind 的範例範本下載一份。
Access 開啟 Northwind 資料庫後,關閉最初出現的登入對話框,然後展開導航面板。 選擇導航窗格頂端,然後選擇 物件類型 ,以依類型組織所有資料庫物件。 接著,展開 查詢 群組,你會看到一個叫 做 Product Transactions 的查詢。
您可以輕鬆辨別聯集查詢與其他查詢物件,因為前者會擁有一個特殊圖示,看起來像兩個圓圈交叉在一起,代表這是一個由兩個集組成的聯集:
Access
與一般的選擇查詢和動作查詢不同,聯合查詢中資料表並不相關。 這表示你無法使用 Access 圖形查詢設計器來建立或編輯聯合查詢。 如果你從導航窗格開啟聯合查詢,Access 就會打開並以資料表檢視顯示結果。 在「主頁」標籤的「Views」中,注意在處理 union 查詢時無法使用 Design View。 你只能在 資料表檢視 和 SQL 檢視之間切換。
要繼續研究這個聯集查詢範例,請點擊 「首頁>」>SQL 檢視 以查看 SQL 定義它的語法。 在這個示意圖中,我們在 中 SQL 增加了一些額外的間距,讓你能輕鬆看到組成聯合查詢的不同部分。
讓我們詳細看看 SQL Northwind 資料庫中這個 union 查詢的語法:
SELECT [Product ID], [Order Date], [Company Name], [Transaction], [Quantity]
FROM [Product Orders]
UNION
SELECT [Product ID], [Creation Date], [Company Name], [Transaction], [Quantity]
FROM [Product Purchases]
ORDER BY [Order Date] DESC;
此 SQL 陳述式的第一與第三部分其實是兩個選取查詢。 這些查詢會擷取兩組不同的記錄;一組來自 [產品訂單] 資料表,一組來自 [採購產品] 資料表。
這 SQL 句話的第二部分是 UNION 關鍵字,指示 Access 將這兩組紀錄合併。
此 SQL 陳述的最後部分透過陳述 ORDER BY 決定合併紀錄的順序。 在此範例中,Access 依訂單日期欄位依序排列所有紀錄,並依遞減順序排列。
注意
Access 中的聯集查詢永遠都是唯讀;您無法變更資料工作表檢視中的任何值。
透過建立並合併選取查詢來建立聯集查詢
雖然你可以直接在 SQL View 寫SQL語法來建立聯合查詢,但你可能會發現用選取的查詢分段來做比較容易。 這樣一來,您也可以複製並貼上 SQL 組件,將它們合併成一個聯集查詢。
如果您想要略過步驟說明並改為觀看範例,請參閱下一節:觀看建立聯集查詢的範例。
- 在 [建立] 索引標籤的 [查詢] 群組中,按一下 [查詢設計]。
- 雙擊包含你想包含欄位的表格。 資料表便會新增至查詢設計視窗。
- 在查詢設計視窗中,按兩下您想要包含的每一個欄位。 選取欄位時,請務必確認您加入的欄位數目和順序必須和其他選取查詢一樣。 請特別注意欄位的資料類別,並確認這些資料類別和您要合併之其他選取查詢中相同位置的欄位相容。 例如,如果您的第一個選取查詢包含五個欄位,其中第一個欄位包含日期/時間資料,您必須確認要合併的每個其他選取查詢也有五個欄位,且第一個欄位包含日期/時間資料,依此類推。
- (選擇性) 您也可以在欄位中加入準則,方法是在欄位格線的 [準則] 列輸入適當的運算式。
- 在您完成新增欄位及欄位準則後,您應該執行選取查詢並檢視輸出結果。 在 [設計] 索引標籤上的 [結果] 群組中,按一下 [執行]。
- 切換查詢至 [設計檢視]。
- 儲存選取查詢,並保持在開啟的狀態。
- 為您想要合併的每一個選取查詢重複相同的程序。
既然你已經建立了選擇的查詢,接下來就要將它們結合起來。 在此步驟中,你透過複製並貼上 SQL 這些語句來建立聯合查詢。
- 在 [建立] 索引標籤的 [查詢] 群組中,按一下 [查詢設計]。
- 在 [設計] 索引標籤上,按一下 [查詢] 群組中的 [聯集]。 Access 會隱藏查詢設計視窗,並顯示 SQL View 物件標籤。此時,分頁是空的。
- 按一下您想要在聯集查詢中合併的第一個選取查詢的索引標籤。
- 在 「主頁 」分頁,點選 「檢視>SQL 檢視」。
- 複製
SQL選取查詢的語句。 然後按一下您先前著手建立之聯集查詢的索引標籤。 - 將 select 查詢的語句貼
SQL到 union 查詢的 SQL View 物件標籤中。 - 刪除 select 查詢
SQL語句末尾的分號 ();。 - 按 Enter 鍵將游標往下移動一行,然後在新行輸入
UNION。 - 按一下您想要在聯集查詢中合併的下一個選取查詢的索引標籤。
- 重複步驟 5 到 10,直到你將所有
SQLselect 查詢的語句複製貼上到 union 查詢的 SQL View 視窗。 最後一次選擇查詢的陳述句後,不要刪除分號或打入任何SQL東西。 - 在 [設計] 索引標籤上的 [結果] 群組中,按一下 [執行]。
您的聯集查詢結果會顯示在 [資料工作表檢視] 中。
觀看建立聯集查詢的範例
這裡有一個你可以在 Northwind 樣本資料庫中重現的範例。 這個聯集查詢能收集 [客戶] 資料表中人員的姓名,並將它們與 [供應商] 資料表中人員的姓名結合。 如果您需要遵循的依據,請在您的 Northwind 範本資料庫中按照以下步驟操作。
以下為建立此範例的必要步驟:
請分別使用 [客戶] 和 [供應商] 資料表做為資料來源,建立兩個名為 [查詢1] 與 [查詢2] 的選取查詢。 使用 [名字] 和 [姓氏] 做為顯示的值。
建立名為 [查詢3] 且不含資料來源的新查詢,然後按一下 [設計] 索引標籤上的 [聯集] 命令,讓此查詢成為聯集查詢。
複製 [查詢1] 與 [查詢2] 的 SQL 陳述式,並貼到 [查詢3]。 記得移除多餘的分號並加上
UNION關鍵字。 您可以隨後在資料工作表檢視中檢查結果。在其中一查詢中加入排序子句,然後將該
ORDER BY陳述貼到 SQL 檢視的聯合查詢中。 注意,在聯集查詢 [查詢3] 中附加順序時,請先移除分號,然後再移除欄位名稱中的資料表名稱。SQL這個聯合查詢範例中,最後一個組合名稱的組合與排序方式如下:SELECT Customers.Company, Customers.[Last Name], Customers.[First Name] FROM Customers UNION SELECT Suppliers.Company, Suppliers.[Last Name], Suppliers.[First Name] FROM Suppliers ORDER BY [Last Name], [First Name];
如果你很擅長寫SQL語法,可以直接在 SQL View 裡寫SQL自己的 union 查詢語句。 不過,你可能會覺得像從其他查詢物件複製並貼上 SQL 這樣的方法很有幫助。 每個查詢都可能比這裡使用的簡單選擇查詢範例複雜得多。 在合併查詢前,仔細建立並測試每個查詢會對你有利。 如果聯合查詢無法執行,你可以逐一調整每個查詢直到成功,然後用修正後的語法重建聯合查詢。
請參閱本文其餘內容,以深入了解更多關於聯集查詢使用方式的祕訣和訣竅。
在聯集查詢中合併三個或以上的資料表或查詢
在前一節使用 Northwind 資料庫的範例中,僅合併兩個資料表的資料。 不過,您可以在一個聯集查詢中,輕鬆合併三個或以上的資料表或查詢。 以先前的範例為例,您可能也想在查詢結果中納入「員工」的姓名。 您可以藉由新增第三個查詢來達成此工作,請使用另一個 UNION 關鍵字來結合先前的 SQL 陳述式,就像這樣:
SELECT Customers.Company, Customers.[Last Name], Customers.[First Name]
FROM Customers
UNION
SELECT Suppliers.Company, Suppliers.[Last Name], Suppliers.[First Name]
FROM Suppliers
UNION
SELECT Employees.Company, Employees.[Last Name], Employees.[First Name]
FROM Employees
ORDER BY [Last Name], [First Name];
當你在資料表檢視結果時,所有員工都會以範例公司名稱列出,這可能不太實用。 如果你想讓該欄位顯示某人是內部員工、供應商還是客戶,你可以用 固定值 代替公司名稱。 長 SQL 什麼樣子:
SELECT "Customer" As Employment, Customers.[Last Name], Customers.[First Name]
FROM Customers
UNION
SELECT "Supplier" As Employment, Suppliers.[Last Name], Suppliers.[First Name]
FROM Suppliers
UNION
SELECT "In-house" As Employment, Employees.[Last Name], Employees.[First Name]
FROM Employees
ORDER BY [Last Name], [First Name];
以下是資料工作表檢視顯示的結果。 Access 會顯示以下五個範例記錄:
| 任職 | 姓氏 | 名字 |
|---|---|---|
| 內部員工 | 黃 | 雅婷 |
| 內部員工 | 羅 | 雅心 |
| 供應商 | 巫 | 百勝 |
| 客戶 | 唐 | 祖安 |
| 客戶 | 汪 | 彥亭 |
你還可以進一步減少查詢,因為 Access 只會從聯合查詢的第一個查詢讀取輸出欄位的名稱。 此處移除第二與第三查詢區段的輸出:
SELECT "Customer" As Employment, [Last Name], [First Name]
FROM Customers
UNION
SELECT "Supplier", [Last Name], [First Name]
FROM Suppliers
UNION
SELECT "In-house", [Last Name], [First Name]
FROM Employees
ORDER BY [Last Name], [First Name];
聯合查詢中的過濾
在 Access 聯合查詢中,排序只能一次,但你可以逐一篩選每個查詢。 在前一節的聯結查詢基礎上,這裡有一個範例,透過新增 WHERE 子句來過濾每個查詢。
SELECT "Customer" As Employment, Customers.[Last Name], Customers.[First Name]
FROM Customers
WHERE [State/Province] = "UT"
UNION
SELECT "Supplier", [Last Name], [First Name]
FROM Suppliers
WHERE [Job Title] = "Sales Manager"
UNION
SELECT "In-house", Employees.[Last Name], Employees.[First Name]
FROM Employees
WHERE City = "Seattle"
ORDER BY [Last Name], [First Name];
切換到資料工作表檢視後,您會看到類似這樣的結果:
| 任職 | 姓氏 | 名字 |
|---|---|---|
| 供應商 | 章 | 家貞 |
| 內部員工 | 黃 | 雅婷 |
| 客戶 | 錢 | 文杉 |
| 內部員工 | 邱 | 安婕 |
| 供應商 | 連 | 美芸 |
| 客戶 | 郭 | 克儀 |
| 供應商 | 楊 | 棟材 |
| 供應商 | 翁 | 捷生 |
| 內部員工 | 鐘 | 漢克 |
| 供應商 | 王 | 惠恩 |
| 內部員工 | 費 | 邦良 |
混用資料類型
如果你聯結的查詢差異很大,可能會遇到輸出欄位必須合併不同資料型態資料的情況。 在這種情況下,聯集查詢通常會使用文字資料類型來傳回結果,因為該資料類型能同時支援文字「和」數字。
我們將使用 Northwind 範例資料庫中的「產品交易」聯集查詢,來了解其中原理。 請開啟範例資料庫,然後在資料工作表檢視中開啟 [產品交易] 查詢。 最後十筆記錄應該會類似下列輸出結果:
| 產品 ID | 訂單日期 | 公司名稱 | 交易 | 數量 |
|---|---|---|---|---|
| 77 | 2006/1/22 | 供應商 B | 購買 | 60 |
| 80 | 2006/1/22 | 供應商 D | 購買 | 75 |
| 81 | 2006/1/22 | 供應商 A | 購買 | 125 |
| 81 | 2006/1/22 | 供應商 A | 購買 | 200 |
| 7 | 2006/1/20 | 公司 D | 銷售 | 10 |
| 51 | 2006/1/20 | 公司 D | 銷售 | 10 |
| 80 | 2006/1/20 | 公司 D | 銷售 | 10 |
| 34 | 2006/1/15 | 公司 AA | 銷售 | 100 |
| 80 | 2006/1/15 | 公司 AA | 銷售 | 30 |
假設你想將數量欄位拆分為兩個欄位:買入和賣出。 我們也假設你想要一個固定的零值,場沒有值。 這是 SQL 這個工會查詢的樣子:
SELECT [Product ID], [Order Date], [Company Name], [Transaction], 0 As Buy, [Quantity] As Sell
FROM [Product Orders]
UNION
SELECT [Product ID], [Creation Date], [Company Name], [Transaction], [Quantity] As Buy, 0 As Sell
FROM [Product Purchases]
ORDER BY [Order Date] DESC;
如果您切換成資料工作表檢視,您會看到現在顯示的最後十筆資料如下:
| 產品 ID | 訂單日期 | 公司名稱 | 交易 | 買入 | 賣出 |
|---|---|---|---|---|---|
| 74 | 2006/1/22 | 供應商 B | 購買 | 20 | 0 |
| 77 | 2006/1/22 | 供應商 B | 購買 | 60 | 0 |
| 80 | 2006/1/22 | 供應商 D | 購買 | 75 | 0 |
| 81 | 2006/1/22 | 供應商 A | 購買 | 125 | 0 |
| 81 | 2006/1/22 | 供應商 A | 購買 | 200 | 0 |
| 7 | 2006/1/20 | 公司 D | 銷售 | 0 | 10 |
| 51 | 2006/1/20 | 公司 D | 銷售 | 0 | 10 |
| 80 | 2006/1/20 | 公司 D | 銷售 | 0 | 10 |
| 34 | 2006/1/15 | 公司 AA | 銷售 | 0 | 100 |
| 80 | 2006/1/15 | 公司 AA | 銷售 | 0 | 30 |
繼續這個例子,如果你想讓值為零的欄位是空的呢? 你可以透過加入Null關鍵字來修改 顯示SQL「什麼都沒有」而不是「零」,如圖所示:
SELECT [Product ID], [Order Date], [Company Name], [Transaction], Null As Buy, [Quantity] As Sell
FROM [Product Orders]
UNION
SELECT [Product ID], [Creation Date], [Company Name], [Transaction], [Quantity] As Buy, Null As Sell
FROM [Product Purchases]
ORDER BY [Order Date] DESC;
不過,當您切換至資料工作表檢視後可能會發現,這樣的做法造成了某個預期外的結果。 [買入] 資料欄中的每個欄位都是空白的:
| 產品 ID | 訂單日期 | 公司名稱 | 交易 | 買入 | 賣出 |
|---|---|---|---|---|---|
| 74 | 2006/1/22 | 供應商 B | 購買 | ||
| 77 | 2006/1/22 | 供應商 B | 購買 | ||
| 80 | 2006/1/22 | 供應商 D | 購買 | ||
| 81 | 2006/1/22 | 供應商 A | 購買 | ||
| 81 | 2006/1/22 | 供應商 A | 購買 | ||
| 7 | 2006/1/20 | 公司 D | 銷售 | 10 | |
| 51 | 2006/1/20 | 公司 D | 銷售 | 10 | |
| 80 | 2006/1/20 | 公司 D | 銷售 | 10 | |
| 34 | 2006/1/15 | 公司 AA | 銷售 | 100 | |
| 80 | 2006/1/15 | 公司 AA | 銷售 | 30 |
這是因為 Access 從第一個查詢決定欄位的資料型態。 在這個例子中,Null 不是一個數字。
那麼,如果你嘗試插入一個空字串來表示欄位的空白值,會發生什麼事? 這次嘗試的做法 SQL 可能如下:
SELECT [Product ID], [Order Date], [Company Name], [Transaction], "" As Buy, [Quantity] As Sell
FROM [Product Orders]
UNION
SELECT [Product ID], [Creation Date], [Company Name], [Transaction], [Quantity] As Buy, "" As Sell
FROM [Product Purchases]
ORDER BY [Order Date] DESC;
切換到資料工作表檢視後,您會看到 Access 擷取了 [買入] 值,但將這些值轉換成了文字。 判斷這是文字值的理由,是因為它們在資料工作表檢視中都顯示為靠左對齊。 由於第一個查詢中的空字串並非數字,您才會看到這樣的結果。 您還會發現,因為購買記錄中包含了空字串,所以 [賣出] 值也都轉換成文字了。
| 產品 ID | 訂單日期 | 公司名稱 | 交易 | 買入 | 賣出 |
|---|---|---|---|---|---|
| 74 | 2006/1/22 | 供應商 B | 購買 | 20 | |
| 77 | 2006/1/22 | 供應商 B | 購買 | 60 | |
| 80 | 2006/1/22 | 供應商 D | 購買 | 75 | |
| 81 | 2006/1/22 | 供應商 A | 購買 | 125 | |
| 81 | 2006/1/22 | 供應商 A | 購買 | 200 | |
| 7 | 2006/1/20 | 公司 D | 銷售 | 10 | |
| 51 | 2006/1/20 | 公司 D | 銷售 | 10 | |
| 80 | 2006/1/20 | 公司 D | 銷售 | 10 | |
| 34 | 2006/1/15 | 公司 AA | 銷售 | 100 | |
| 80 | 2006/1/15 | 公司 AA | 銷售 | 30 |
該如何解決這個難題呢?
一種解決方案是強制查詢預期欄位值為數字。 你可以用這個表達式來做到:
IIf(False, 0, Null)
檢查 False的條件永遠不是 True,因此表達式總是回傳 Null。 然而,Access 仍然會評估兩種輸出選項,並將輸出視為數字或 Null。
以下是將這個運算式運用在我們現有範例中的做法:
SELECT [Product ID], [Order Date], [Company Name], [Transaction], IIf(False, 0, Null) As Buy, [Quantity] As Sell
FROM [Product Orders]
UNION
SELECT [Product ID], [Creation Date], [Company Name], [Transaction], [Quantity] As Buy, Null As Sell
FROM [Product Purchases]
ORDER BY [Order Date] DESC;
你不需要修改第二個查詢。
切換到資料工作表檢視後,您就會看到我們想要的結果:
| 產品 ID | 訂單日期 | 公司名稱 | 交易 | 買入 | 賣出 |
|---|---|---|---|---|---|
| 74 | 2006/1/22 | 供應商 B | 購買 | 20 | |
| 77 | 2006/1/22 | 供應商 B | 購買 | 60 | |
| 80 | 2006/1/22 | 供應商 D | 購買 | 75 | |
| 81 | 2006/1/22 | 供應商 A | 購買 | 125 | |
| 81 | 2006/1/22 | 供應商 A | 購買 | 200 | |
| 7 | 2006/1/20 | 公司 D | 銷售 | 10 | |
| 51 | 2006/1/20 | 公司 D | 銷售 | 10 | |
| 80 | 2006/1/20 | 公司 D | 銷售 | 10 | |
| 34 | 2006/1/15 | 公司 AA | 銷售 | 100 | |
| 80 | 2006/1/15 | 公司 AA | 銷售 | 30 |
另一種能獲得相同結果的方法,是在聯集查詢中的查詢前面再加上另一個查詢:
SELECT
0 As [Product ID], Date() As [Order Date],
"" As [Company Name], "" As [Transaction],
0 As Buy, 0 As Sell
FROM [Product Orders]
WHERE False
Access 會針對每個欄位傳回您定義之資料類型的定值。 當然,您不會想要此查詢的輸出影響最後結果,因此,避免這種情況發生的訣竅是在 False 上加入一個 WHERE 子句:
WHERE False
這只是個小把戲。 由於條件總是為假,查詢不會回傳任何東西。 將此陳述式結合現有的 SQL,我們便會獲得下列完整陳述式:
SELECT
0 As [Product ID], Date() As [Order Date],
"" As [Company Name], "" As [Transaction],
0 As Buy, 0 As Sell
FROM [Product Orders]
WHERE False
UNION
SELECT [Product ID], [Order Date], [Company Name], [Transaction], Null As Buy, [Quantity] As Sell
FROM [Product Orders]
UNION
SELECT [Product ID], [Creation Date], [Company Name], [Transaction], [Quantity] As Buy, Null As Sell
FROM [Product Purchases]
ORDER BY [Order Date] DESC;
注意
在這個例子中,Northwind資料庫中的合併查詢回傳100筆紀錄,而兩個獨立查詢分別回傳58和43筆,總計101筆。 這種差異是因為兩張紀錄並非唯一。 請參閱「 在聯合查詢中使用 UNION ALL 處理不同紀錄 」,了解如何利用 來解決此情境 UNION ALL。
在聯集查詢中新增合計
聯合查詢的一個特殊用途是將一組紀錄與一個包含一個或多個欄位總和的紀錄合併。
以下是另一個您可以在 Northwind 範本資料庫中建立的範例,示範如何在聯集查詢中取得合計。
請使用下列 SQL 語法建立新的簡易查詢,來檢視啤酒的購買狀況 (Northwind 資料庫中的產品識別碼=34):
SELECT [Purchase Order Details].[Date Received], [Purchase Order Details].Quantity FROM [Purchase Order Details] WHERE ((([Purchase Order Details].[Product ID])=34)) ORDER BY [Purchase Order Details].[Date Received];切換到資料工作表檢視,您應該會看到四筆購買記錄:
收到日期 數量 2006/1/22 100 2006/1/22 60 2006/4/4 50 2006/4/5 300 為了獲得合計,請使用下列 SQL 來建立簡易的彙總查詢:
SELECT Max([Date Received]), Sum([Quantity]) AS SumOfQuantity FROM [Purchase Order Details] WHERE ((([Purchase Order Details].[Product ID])=34))切換到資料工作表檢視,您應該只會看到一筆記錄:
收到的最大日期 數量加總 2006/4/5 510 將這兩個查詢合併為一個聯集查詢,以便將含有合計數量的記錄新增到購買記錄中:
SELECT [Purchase Order Details].[Date Received], [Purchase Order Details].Quantity FROM [Purchase Order Details] WHERE ((([Purchase Order Details].[Product ID])=34)) UNION SELECT Max([Date Received]), Sum([Quantity]) AS SumOfQuantity FROM [Purchase Order Details] WHERE ((([Purchase Order Details].[Product ID])=34)) ORDER BY [Purchase Order Details].[Date Received];切換到資料工作表檢視,您應該會看到四筆含有各自加總的購買記錄,並且最後面跟著一筆數量合計記錄:
收到日期 數量 2006/1/22 60 2006/1/22 100 2006/4/4 50 2006/4/5 300 2006/4/5 510
這就是在聯集查詢中新增合計的基本用法。 你也可以在兩個查詢中加入固定值,例如「Detail」和「Total」,以視覺化區分總紀錄與其他紀錄。 您可以在在一個聯集查詢合併三個或以上的資料表或查詢一節中,重新檢視如何使用定值。
使用 UNION ALL 來處理聯集查詢中的相異記錄
根據預設,Access 中的聯集查詢都只會包含相異的記錄。 但如果您想要包含所有記錄呢? 以下為另一個實用的範例。
在前一節中,我們示範如何在聯集查詢中建立合計。 修改該聯合查詢SQL以包含:Product ID = 48
SELECT [Purchase Order Details].[Date Received], [Purchase Order Details].Quantity
FROM [Purchase Order Details]
WHERE ((([Purchase Order Details].[Product ID])=48))
UNION
SELECT Max([Date Received]), Sum([Quantity]) AS SumOfQuantity
FROM [Purchase Order Details]
WHERE ((([Purchase Order Details].[Product ID])=48))
ORDER BY [Purchase Order Details].[Date Received];
切換到資料工作表檢視,您應該只會看到一筆不正確的記錄:
| 收到日期 | 數量 |
|---|---|
| 2006/1/22 | 100 |
| 2006/1/22 | 200 |
當然,一條紀錄不會回傳兩倍總數。
你會看到這個結果,是因為有一天,相同數量的巧克力被賣出兩次,這點在採購訂單細節表中有記錄。 以下這個簡易選取查詢的結果顯示了 Northwind 範例資料庫中的這兩筆記錄:
| 訂購單識別碼 | 產品 | 數量 |
|---|---|---|
| 100 | Northwind 貿易巧克力 | 100 |
| 92 | Northwind 貿易巧克力 | 100 |
在前面提到的聯合查詢中,你可以看到購買訂單 ID 欄位沒有包含,且這兩個欄位並非兩個獨立的紀錄。
如果你想包含所有紀錄,請用 UNION ALL 代替 UNIONSQL。 這很可能會影響結果的排序,所以你也可以加入 ORDER BY 一個條款來決定排序順序。 以下是基於前述範例的修改 SQL 版:
SELECT [Purchase Order Details].[Date Received], Null As [Total], [Purchase Order Details].Quantity
FROM [Purchase Order Details]
WHERE ((([Purchase Order Details].[Product ID])=48))
UNION ALL
SELECT Max([Date Received]), "Total" As [Total], Sum([Quantity]) AS SumOfQuantity
FROM [Purchase Order Details]
WHERE ((([Purchase Order Details].[Product ID])=48))
ORDER BY [Total];
切換到資料工作表檢視後,您應該會看到所有詳細資料,並看到最後一筆記錄還加上了「合計」兩個字:
| 收到日期 | 合計 | 數量 |
|---|---|---|
| 2006/1/22 | 100 | |
| 2006/1/22 | 100 | |
| 2006/1/22 | 合計 | 200 |
透過下拉式方塊控制項,使用聯集查詢篩選表單上的記錄
聯集查詢的其中一個常見用法,是在表單上做為下拉式方塊控制項的記錄來源。 您可以使用該下拉式方塊來選取值,以篩選表單的記錄。 例如,依據員工所在城市來篩選其記錄。
為了查看運作方式,以下是另一個您可以在 Northwind 範本資料庫中建立的範例,以示範這種案例。
請使用以下
SQL語法建立一個簡單的選擇查詢:SELECT Employees.City, Employees.City AS Filter FROM Employees;切換到資料工作表檢視,您應該會看到下列結果:
城市 篩選 西雅圖 西雅圖 貝爾維尤 貝爾維尤 雷德蒙德 雷德蒙德 柯克蘭 柯克蘭 西雅圖 西雅圖 雷德蒙德 雷德蒙德 西雅圖 西雅圖 雷德蒙德 雷德蒙德 西雅圖 西雅圖 在這些結果中,您可能看不到多少值。 不過,請展開查詢,並透過以下
SQL方法將其轉為聯合查詢:SELECT Employees.City, Employees.City AS Filter FROM Employees UNION SELECT "<All>", "*" AS Filter FROM Employees ORDER BY City;切換到資料工作表檢視,您應該會看到下列結果:
城市 篩選 <全部> * 貝爾維尤 貝爾維尤 柯克蘭 柯克蘭 雷德蒙德 雷德蒙德 西雅圖 西雅圖 Access 會將先前所示的九條記錄合併,欄位值為 <All> 與「*」。 由於此聯結子句不包含
UNION ALL,Access 只回傳不同的記錄。 這表示每個城市只會回傳一次,且有固定相同的數值。現在,您擁有了一個只會顯示各城市名稱一次的聯集查詢,且其中包含一個能夠選取所有城市的選項,您可以將此查詢做為表單上某個下拉式方塊的記錄來源。 如果使用此特定範例做為模型,您可以在表單上建立一個下拉式方塊控制項,將此查詢設為該控制項的記錄來源,並將 [篩選] 資料行的 [欄寬] 屬性設為 0 (零) 以在視覺上將它隱藏,然後再將 [繫結資料行] 屬性設為 1,以做為第二個資料行的索引。 在
Filter表單本身的屬性中,你可以加入以下程式碼,利用組合框控制中選定的值來啟動表單過濾器:Me.Filter = "[City] Like '" & Me![FilterComboBoxName].Value & "'" Me.FilterOn = True使用者可以將表單紀錄篩選到特定城市名稱,或選擇 <「全部> 」來列出所有城市的紀錄。