有時候您可能想要將一個資料表或查詢中的記錄與一或多個其他資料表中的記錄合併成一個結果。 這便是聯集查詢在 Access 中的作用。
為了有效率地了解聯集查詢,建議您先熟悉如何在 Access 中設計基本選取查詢。 若要深入了解基本選取查詢,請參閱建立簡單的選取查詢 (機器翻譯)。
研究運用聯集查詢的範例
如果您從未建立過聯集查詢,那麼先研究 Northwind Access 範本中的工作範例可能會有所幫助。 您可以在 Access 的快速入門頁面上選取 [新增檔案>] 來搜尋 Northwind 範例範本。 您也可以直接從 Northwind 範例範本下載複本。
Access 開啟 Northwind 資料庫之後,關閉第一個出現的登入對話方塊,然後展開 [瀏覽窗格]。 選取 [瀏覽窗格] 頂端,然後選取 [物件類型] 以依類型組織所有資料庫物件。 接下來,展開 [査詢 ] 群組,您會看到名為 [產品交易] 的查詢。
您可以輕鬆辨別聯集查詢與其他查詢物件,因為前者會擁有一個特殊圖示,看起來像兩個圓圈交叉在一起,代表這是一個由兩個集組成的聯集:
不同於一般選取和巨集指令查詢,聯集查詢中的資料表不相關。 這表示您無法使用 Access 圖形查詢設計工具來建立或編輯聯合查詢。 如果您從 [瀏覽窗格] 開啟聯集查詢,Access 會開啟它,並在 [資料工作表檢視] 中顯示結果。 請注意,在 [常用] 索引標籤的 [檢視] 底下,當您使用聯集查詢時,[設計檢視] 無法使用。 您只能在 [資料工作表檢視] 和 [SQL 檢視] 之間切換。
若要繼續研究此聯集查詢範例,請按一下 [常用>檢視] [>SQL 檢視] 以檢視 SQL 定義它的語法。 在此圖例中,我們新增了一些額外的間距 SQL ,以便您可以輕鬆查看組成聯集查詢的各個部分。
讓我們詳細看看 SQL 來自 Northwind 資料庫的這個聯集查詢的語法:
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 檢視中撰寫SQL語法來建立聯集查詢,但您可能會發現使用選取查詢將其分成部分建置會比較容易。 這樣一來,您也可以複製並貼上 SQL 組件,將它們合併成一個聯集查詢。
如果您想要略過步驟說明並改為觀看範例,請參閱下一節:觀看建立聯集查詢的範例。
- 在 [建立] 索引標籤的 [查詢] 群組中,按一下 [查詢設計]。
- 按兩下含有您要包含之欄位的資料表。 資料表便會新增至查詢設計視窗。
- 在查詢設計視窗中,按兩下您想要包含的每一個欄位。 選取欄位時,請務必確認您加入的欄位數目和順序必須和其他選取查詢一樣。 請特別注意欄位的資料類別,並確認這些資料類別和您要合併之其他選取查詢中相同位置的欄位相容。 例如,如果您的第一個選取查詢包含五個欄位,其中第一個欄位包含日期/時間資料,您必須確認要合併的每個其他選取查詢也有五個欄位,且第一個欄位包含日期/時間資料,依此類推。
- (選擇性) 您也可以在欄位中加入準則,方法是在欄位格線的 [準則] 列輸入適當的運算式。
- 在您完成新增欄位及欄位準則後,您應該執行選取查詢並檢視輸出結果。 在 [設計] 索引標籤上的 [結果] 群組中,按一下 [執行]。
- 切換查詢至 [設計檢視]。
- 儲存選取查詢,並保持在開啟的狀態。
- 為您想要合併的每一個選取查詢重複相同的程序。
現在您已建立選取查詢,是時候合併它們了。 在此步驟中,您可以複製並貼 SQL 上陳述式來建立聯集查詢。
- 在 [建立] 索引標籤的 [查詢] 群組中,按一下 [查詢設計]。
- 在 [設計] 索引標籤上,按一下 [查詢] 群組中的 [聯集]。 Access 會隱藏查詢設計視窗,並顯示 [SQL 檢視 物件] 索引標籤。此時,索引標籤是空的。
- 按一下您想要在聯集查詢中合併的第一個選取查詢的索引標籤。
- 按一下 [ 常用 ] 索引標籤上的 [ 檢視>SQL 檢視]。
- 複製
SQL選取查詢的陳述式。 然後按一下您先前著手建立之聯集查詢的索引標籤。 - 將選取查詢的陳述式貼到
SQL聯集查詢的 [SQL 檢視 物件] 索引標籤中。 - 刪除 select 查詢
SQL陳述式結尾的分號 (;) 。 - 按 Enter 將游標向下移動一行,然後在
UNION新的一行輸入。 - 按一下您想要在聯集查詢中合併的下一個選取查詢的索引標籤。
- 重複步驟 5 到 10,直到您將選取查詢的所有
SQL陳述式複製並貼上到聯集查詢的 [SQL 檢視 ] 視窗為止。 請勿刪除分號,或在最後一個選取查詢的陳述式後SQL面輸入任何內容。 - 在 [設計] 索引標籤上的 [結果] 群組中,按一下 [執行]。
您的聯集查詢結果會顯示在 [資料工作表檢視] 中。
觀看建立聯集查詢的範例
以下是您可以在 Northwind 範例資料庫中重新建立的範例。 這個聯集查詢能收集 [客戶] 資料表中人員的姓名,並將它們與 [供應商] 資料表中人員的姓名結合。 如果您需要遵循的依據,請在您的 Northwind 範本資料庫中按照以下步驟操作。
以下為建立此範例的必要步驟:
請分別使用 [客戶] 和 [供應商] 資料表做為資料來源,建立兩個名為 [查詢1] 與 [查詢2] 的選取查詢。 使用 [名字] 和 [姓氏] 做為顯示的值。
建立名為 [查詢3] 且不含資料來源的新查詢,然後按一下 [設計] 索引標籤上的 [聯集] 命令,讓此查詢成為聯集查詢。
複製 [查詢1] 與 [查詢2] 的 SQL 陳述式,並貼到 [查詢3]。 請務必移除多餘的分號並新增
UNION關鍵字。 您可以隨後在資料工作表檢視中檢查結果。將 ordering 子句新增至其中一個查詢,然後將該
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 檢視中撰寫SQL聯集查詢的陳述式。 不過,遵循從其他查詢物件複製並貼上 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
這是一個小技巧。 因為條件永遠為 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 |
在前面提到的聯集查詢中,您可以看到 [訂購單識別碼] 欄位不包括在內,而且這兩個欄位不組成兩筆不同的記錄。
如果您想要包含所有記錄,請在 UNION ALLUNIONSQL. 這很可能會影響結果的排序,因此您可能也想要包含一個 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 子句不包含
UNION ALL,Access 只會傳回不同的記錄。 這表示每個城市只會以固定相同的值返回一次。現在,您擁有了一個只會顯示各城市名稱一次的聯集查詢,且其中包含一個能夠選取所有城市的選項,您可以將此查詢做為表單上某個下拉式方塊的記錄來源。 如果使用此特定範例做為模型,您可以在表單上建立一個下拉式方塊控制項,將此查詢設為該控制項的記錄來源,並將 [篩選] 資料行的 [欄寬] 屬性設為 0 (零) 以在視覺上將它隱藏,然後再將 [繫結資料行] 屬性設為 1,以做為第二個資料行的索引。 在表單本身的屬性中
Filter,您可以新增如下所示的程式碼,以使用下拉式方塊控制項中選取的值來啟用表單篩選:Me.Filter = "[City] Like '" & Me![FilterComboBoxName].Value & "'" Me.FilterOn = True然後,表單使用者可以將表單記錄篩選為特定城市名稱,或選取 [全部>] <以列出所有城市的所有記錄。