使用聯集查詢合併多個查詢產生單一結果

使用聯集查詢合併多個查詢產生單一結果

有時候,您可能會想要在列出某份資料表或查詢中記錄的同時,也會列出一或多個資料表中的記錄,並以此建立一整組記錄 (簡單來說,這是一份同時出現在兩個或以上資料表中所有記錄的清單)。此時 Access 中的聯集查詢就能派上用場。

為了有效率地了解聯集查詢,建議您先熟悉如何在 Access 中設計基本選取查詢。若要深入了解基本選取查詢,請參閱建立簡單的選取查詢 (機器翻譯)。

附註: 本文中資訊是供 Access 桌面資料庫使用。您無法在 Access Web 資料庫或 Access Web App 中建立或使用聯集查詢。

研究運用聯集查詢的範例

如果您從未建立過聯集查詢,從研究 Northwind Access 範本中的實際範例入手可能會對您有幫助。您可以在 Access 的開始頁面上搜尋 Northwind 範例範本,方法是按一下 [檔案] > [新增],或者您也可以從這個位址直接下載複本:Northwind 範例範本

在 Access 開啟 Northwind 資料庫後,請先關閉出現的登入對話方塊表單,並展開瀏覽窗格。按一下瀏覽窗格頂端,然後選取 [物件類型] 來依據類型整理所有的資料庫物件。接著請展開 [查詢] 群組,您會看到一個名為 [產品交易] 的查詢。

您可以輕鬆辨別聯集查詢與其他查詢物件,因為前者會擁有一個特殊圖示,看起來像兩個圓圈交叉在一起,代表這是一個由兩個集組成的聯集:

Access 中聯集查詢圖示的螢幕擷取畫面。

與一般選取查詢和巨集指令查詢不同,聯集查詢中的資料表並不相關,這表示您無法使用 Access 的圖形化查詢設計工具來建立或編輯聯集查詢。如果您從瀏覽窗格中開啟聯集查詢,就會遇到這種情況;Access 會開啟聯集查詢,並在資料工作表檢視中顯示結果。您會注意到,您無法在處理聯集查詢時使用 [常用] 索引標籤 [檢視] 命令底下的 [設計檢視]。使用聯集查詢時,您只能在 [資料工作表檢視] 與 [SQL 檢視] 之間切換。

若要繼續了解此聯集查詢範例,請按一下 [常用] > [檢視] > [SQL 檢視],以檢視定義此聯集查詢的 SQL 語法。在此示範中,我們為 SQL 加入了部分額外空間,讓您能夠輕鬆查看組成聯集查詢的各個部分。

您的瀏覽器不支援視訊。請安裝 Microsoft Silverlight、Adobe Flash Player 或 Internet Explorer 9。

讓我們來仔細研究 Northwind 資料庫中這個聯集查詢的 SQL 語法:

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 組件,將它們合併成一個聯集查詢。

如果您想要略過步驟說明並改為觀看範例,請參閱下一節:觀看建立聯集查詢的範例

  1. 在 [建立] 索引標籤的 [查詢] 群組中,按一下 [查詢設計]。

  2. 在 [顯示資料表] 對話方塊中,按兩下包含您想要使用之欄位的資料表。資料表便會新增至查詢設計視窗。

  3. 關閉 [顯示資料表] 對話方塊。

  4. 在查詢設計視窗中,按兩下您想要包含的每一個欄位。選取欄位時,請務必確認您加入的欄位數目和順序必須和其他選取查詢一樣。請特別注意欄位的資料類別,並確認這些資料類別和您要合併之其他選取查詢中相同位置的欄位相容。例如,如果您的第一個選取查詢包含五個欄位,其中第一個欄位包含日期/時間資料,您必須確認要合併的每個其他選取查詢也有五個欄位,且第一個欄位包含日期/時間資料,依此類推。

  5. (選擇性) 您也可以在欄位中加入準則,方法是在欄位格線的 [準則] 列輸入適當的運算式。

  6. 在您完成新增欄位及欄位準則後,您應該執行選取查詢並檢視輸出結果。在 [設計] 索引標籤上的 [結果] 群組中,按一下 [執行]。

  7. 切換查詢至 [設計檢視]。

  8. 儲存選取查詢,並保持在開啟的狀態。

  9. 為您想要合併的每一個選取查詢重複相同的程序。

現在您已建立選取查詢,是時候合併它們了。在此步驟中,您會透過複製並貼上 SQL 陳述式來建立聯集查詢。

  1. 在 [建立] 索引標籤的 [查詢] 群組中,按一下 [查詢設計]。

  2. 關閉 [顯示資料表] 對話方塊。

  3. 在 [設計] 索引標籤上,按一下 [查詢] 群組中的 [聯集]。Access 會隱藏查詢設計視窗,並顯示 [SQL 檢視] 物件索引標籤。此時,[SQL 檢視] 物件索引標籤是空的。

  4. 按一下您想要在聯集查詢中合併的第一個選取查詢的索引標籤。

  5. 在 [常用] 索引標籤中按一下 [檢視] > [SQL 檢視]。

  6. 複製選取查詢的 SQL 陳述式。然後按一下您先前著手建立之聯集查詢的索引標籤。

  7. 將選取查詢的 SQL 陳述式貼上至聯集查詢的 [SQL 檢視] 物件索引標籤中。

  8. 刪除選取查詢 SQL 陳述式結尾的分號 (;)。

  9. 按下 Enter,將游標往下移動一行,然後在新行中輸入 UNION。

  10. 按一下您想要在聯集查詢中合併的下一個選取查詢的索引標籤。

  11. 重複步驟 5 至 10,直到選取查詢的所有 SQL 陳述式都已複製貼上到聯集查詢的 [SQL 檢視] 視窗中。請勿刪除最後一個選取查詢的 SQL 陳述式後面的分號,也不要輸入任何項目。

  12. 在 [設計] 索引標籤上的 [結果] 群組中,按一下 [執行]。

您的聯集查詢結果會顯示在 [資料工作表檢視] 中。

觀看建立聯集查詢的範例

以下是一個您可以在 Northwind 範本資料庫中重現的範例。這個聯集查詢能收集 [客戶] 資料表中人員的姓名,並將它們與 [供應商] 資料表中人員的姓名結合。如果您需要遵循的依據,請在您的 Northwind 範本資料庫中按照以下步驟操作。

您的瀏覽器不支援視訊。請安裝 Microsoft Silverlight、Adobe Flash Player 或 Internet Explorer 9。

以下為建立此範例的必要步驟:

  1. 請分別使用 [客戶] 和 [供應商] 資料表做為資料來源,建立兩個名為 [查詢1] 與 [查詢2] 的選取查詢。使用 [名字] 和 [姓氏] 做為顯示的值。

  2. 建立名為 [查詢3] 且不含資料來源的新查詢,然後按一下 [設計] 索引標籤上的 [聯集] 命令,讓此查詢成為聯集查詢。

  3. 複製 [查詢1] 與 [查詢2] 的 SQL 陳述式,並貼到 [查詢3]。請務必移除多餘的分號,並新增 UNION 關鍵字。您可以隨後在資料工作表檢視中檢查結果。

  4. 在其中一個查詢中加入排序子句,然後在聯集查詢 SQL 檢視中貼上 ORDER BY 陳述式。注意,在聯集查詢 [查詢3] 中附加順序時,請先移除分號,然後再移除欄位名稱中的資料表名稱。

  5. 最後,這個能結合並排序姓名的聯集查詢範例 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 範例資料庫中的「產品交易」聯集查詢,來了解其中原理。請開啟範例資料庫,然後在資料工作表檢視中開啟 [產品交易] 查詢。最後十筆記錄應該會類似下列輸出結果:

產品識別碼

訂單日期

公司名稱

交易

數量

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

我們現在假設您想要將 [數量] 欄位分成兩個:[買入] 和 [賣出]。同時,也假設您想要在沒有值的欄位中放入一個 0 的定值。這個聯集查詢的 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; 

如果您切換成資料工作表檢視,您會看到現在顯示的最後十筆資料如下:

產品識別碼

訂單日期

公司名稱

交易

買入

賣出

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

繼續使用此範例,如果想要讓顯示為 0 的欄位保持空白的話,該怎麼做呢?您可以新增 Null 關鍵字來修改 SQL,以空白取代顯示的 0,就像下面這樣:

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;

不過,當您切換至資料工作表檢視後可能會發現,這樣的做法造成了某個預期外的結果。[買入] 資料欄中的每個欄位都是空白的:

產品識別碼

訂單日期

公司名稱

交易

買入

賣出

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 擷取了 [買入] 值,但將這些值轉換成了文字。判斷這是文字值的理由,是因為它們在資料工作表檢視中都顯示為靠左對齊。由於第一個查詢中的空字串並非數字,您才會看到這樣的結果。您還會發現,因為購買記錄中包含了空字串,所以 [賣出] 值也都轉換成文字了。

產品識別碼

訂單日期

公司名稱

交易

買入

賣出

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;

請注意,您並不需要修改第二個查詢。

切換到資料工作表檢視後,您就會看到我們想要的結果:

產品識別碼

訂單日期

公司名稱

交易

買入

賣出

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 範本資料庫中建立的範例,示範如何在聯集查詢中取得合計。

  1. 請使用下列 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];
  2. 切換到資料工作表檢視,您應該會看到四筆購買記錄:

    收到日期

    數量

    2006/1/22

    100

    2006/1/22

    60

    2006/4/4

    50

    2006/4/5

    300

  3. 為了獲得合計,請使用下列 SQL 來建立簡易的彙總查詢:

    SELECT Max([Date Received]), Sum([Quantity]) AS SumOfQuantity
    FROM [Purchase Order Details]
    WHERE ((([Purchase Order Details].[Product ID])=34))
  4. 切換到資料工作表檢視,您應該只會看到一筆記錄:

    收到的最大日期

    數量加總

    2006/4/5

    510

  5. 將這兩個查詢合併為一個聯集查詢,以便將含有合計數量的記錄新增到購買記錄中:

    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];
  6. 切換到資料工作表檢視,您應該會看到四筆含有各自加總的購買記錄,並且最後面跟著一筆數量合計記錄:

    收到日期

    數量

    2006/1/22

    60

    2006/1/22

    100

    2006/4/4

    50

    2006/4/5

    300

    2006/4/5

    510

這就是在聯集查詢中新增合計的基本用法。您可能還想要在兩個查詢中都加入像是「詳細資料」和「合計」之類的定值,以視覺化的方式區隔合計記錄與其他記錄。您可以在在一個聯集查詢合併三個或以上的資料表或查詢一節中,重新檢視如何使用定值。

根據預設,Access 中的聯集查詢都只會包含相異的記錄。但如果您想要包含所有記錄呢?以下為另一個實用的範例。

在前一節中,我們示範如何在聯集查詢中建立合計。請修改該聯集查詢的 SQL,加入產品識別碼= 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

如您所見,先前提到的聯集查詢中並不包含 [訂購單識別碼] 欄位,因此這兩個欄位無法視為兩筆相異的記錄。

如果您想要包含所有記錄,請將 SQL 中使用的 UNION 改為 UNION ALL。在大多數情況下,這會對結果的排序造成影響,因此我們建議您再加入一個 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 範本資料庫中建立的範例,以示範這種案例。

  1. 請使用此 SQL 語法來建立一個簡易選取查詢:

    SELECT Employees.City, Employees.City AS Filter
    FROM Employees;
  2. 切換到資料工作表檢視,您應該會看到下列結果:

    城市

    篩選

    西雅圖

    西雅圖

    貝爾維尤

    貝爾維尤

    雷德蒙德

    雷德蒙德

    柯克蘭

    柯克蘭

    西雅圖

    西雅圖

    雷德蒙德

    雷德蒙德

    西雅圖

    西雅圖

    雷德蒙德

    雷德蒙德

    西雅圖

    西雅圖

  3. 在這些結果中,您可能看不到多少值。不過,您可以使用下列 SQL 來展開查詢,並將它轉換成一個聯集查詢:

    SELECT Employees.City, Employees.City AS Filter
    FROM Employees
    
    UNION
    
    SELECT "<All>", "*" AS Filter
    FROM Employees
    
    ORDER BY City;
  4. 切換到資料工作表檢視,您應該會看到下列結果:

    城市

    篩選

    <全部>

    *

    貝爾維尤

    貝爾維尤

    柯克蘭

    柯克蘭

    雷德蒙德

    雷德蒙德

    西雅圖

    西雅圖

    如前所示,Access 會執行九筆記錄的聯集,並包含固定的欄位值 <All> 和 "*"。

    由於此聯集子句並未包含 UNION ALL,因此 Access 只會傳回相異記錄,這表示每個城市只會傳回一次,且會傳回固定的相同值。

  5. 現在,您擁有了一個只會顯示各城市名稱一次的聯集查詢,且其中包含一個能夠選取所有城市的選項,您可以將此查詢做為表單上某個下拉式方塊的記錄來源。如果使用此特定範例做為模型,您可以在表單上建立一個下拉式方塊控制項,將此查詢設為該控制項的記錄來源,並將 [篩選] 資料行的 [欄寬] 屬性設為 0 (零) 以在視覺上將它隱藏,然後再將 [繫結資料行] 屬性設為 1,以做為第二個資料行的索引。您可以再將下列程式碼加入表單本身的 [篩選] 屬性中,以此使用下拉式方塊控制項裡選取的值來啟用表單篩選:

    Me.Filter = "[City] Like '" & Me![FilterComboBoxName].Value & "'"
    Me.FilterOn = True

    這樣一來,表單的使用者就能篩選表單記錄以獲得某個特定的城市名稱,或是選取 <全部> 來列出所有城市的所有記錄。

頁面頂端

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

這項資訊有幫助嗎?

感謝您的意見反應!

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

×