有时,你可能希望列出来自一个表或查询的记录和来自一个或多个其他表的记录,以形成一组记录,即包含来自两个或多个表中所有记录的列表。 这是 Access 中联合查询的目的。
为有效地理解联合查询,应该首先熟悉在 Access 中设计基本的选择查询。 要了解有关设计选择查询的详细信息,请参阅创建简单的选择查询。
研究工作联合查询实例
如果从未创建过联合查询,那么你可能会发现先研究 Northwind Access 模板中的工作示例很有用。 可以通过单击“文件”>“新建”在 Access 入门页面上搜索 Northwind 示例模板,也可以直接从此位置下载副本:Northwind 示例模板。
在 Access 打开 Northwind 数据库后,关闭首次出现的登录对话框表单,然后展开“导航窗格”。 单击“导航窗格”的顶部,然后选择“对象类型”,按类型组织所有数据库对象。 接下来,展开“查询”组,随即出现一个名为“产品事务”的查询。
联合查询很容易与其他查询对象区分开来,因为它们有一个特殊图标,该图标类似于两个交织的圆圈,表示来自两个集合的交集:
与正常的选择和操作查询不同,表在联合查询中不相关,这意味着 Access 图形查询设计器不能用于构建或编辑联合查询。 如果从“导航窗格”打开联合查询,则将体验到这一点;Access 打开它并在数据表视图中显示结果。 在“开始”选项卡上的“视图”命令下,你会注意到在使用联合查询时“设计视图”不可用。 使用联合查询时,只能在“数据表视图”和“SQL 视图”之间切换。
要继续研究此联合查询示例,请单击“开始”>“视图”>“SQL 视图”以查看定义它的 SQL 语法。 在此示例中,我们在 SQL 中增加了一些额外的空格,以便轻松查看组成联合查询的各个部分。
我们来详细研究 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 部分复制并粘贴到合并的联合查询中。
如果想要跳过阅读步骤并改为观看示例,请参阅下一节:观看构建联合查询的示例。
-
在“创建”选项卡上的“查询”组中,单击“查询设计”。
-
双击包含要包含的字段的表。 这会将该表添加到查询设计窗口。
-
在查询设计窗口中,双击要包括的每个字段。 选择字段时,请确保您在其他选择查询中以相同顺序添加了相同数目的字段。 另外,请注意各个字段的数据类型,确保在要合并的其他查询中,处于相应位置的字段具有兼容的数据类型。 例如,如果第一个选择查询具有五个字段,且第一个字段包含“日期/时间”数据,请确保要合并的其他每个选择查询也具有五个字段,并且第一个字段同样包含“日期/时间”数据,依此类推。
-
另外,你还可以在字段网格的“条件”行中键入适当的表达式,从而向字段中添加条件。
-
添加完字段和字段条件后,应运行选择查询并查看其输出。 在“设计”选项卡上的“结果”组中,单击“运行”。
-
将查询切换到“设计”视图。
-
保存该选择查询,但不要将其关闭。
-
对于要合并的每个选择查询,请重复此过程。
现在已经创建了选择查询,接下来应该合并它们了。 在此步骤中,通过复制和粘贴 SQL 语句来创建联合查询。
-
在“创建”选项卡上的“查询”组中,单击“查询设计”。
-
在“设计”选项卡的“查询”组中,单击“联合”。 Access 将隐藏查询设计窗口并显示 SQL 视图对象选项卡。 此时,SQL 视图对象选项卡中没有任何内容。
-
单击要合并在联合查询中的第一个选择查询的选项卡。
-
在“开始”选项卡上,单击“视图”>“SQL 视图”。
-
复制该选择查询的 SQL 语句。 单击之前开始创建的联合查询的选项卡。
-
将选择查询的 SQL 语句粘贴到联合查询的 SQL 视图对象选项卡中。
-
删除选择查询 SQL 语句末尾的分号 (;)。
-
按 Enter 将光标移到下一行,然后在新行中键入 UNION。
-
单击要合并到联合查询中的下一个选择查询的选项卡。
-
请重复步骤 5 到步骤 10,直至将选择查询的所有 SQL 语句都通过复制和粘贴的方式添加到联合查询的 SQL 视图窗口中。 对于最后一个选择查询的 SQL 语句,请勿删除其分号或键入任何内容。
-
在“设计”选项卡上的“结果”组中,单击“运行”。
联合查询的结果将显示在“数据表”视图中。
观看构建联合查询的示例
这是可以在 Northwind 示例数据库中重新创建的示例。 此联合查询收集“客户”表中的人员姓名,并将他们与“供应商”表中的人员姓名合并起来。 如果想要按本说明操作,请在 Northwind 示例数据库的副本中完成这些步骤。
以下是构建此示例的所需步骤:
-
分别使用“客户”和“供应商”表作为数据源创建两个名为 Query1 和 Query2 的选择查询。 使用“名字”和“姓氏”字段作为显示值。
-
创建一个名为 Query3 且最初没有数据源的新查询,然后单击“设计”选项卡上的“联合”命令,以将此查询转换为联合查询。
-
将 Query1 和 Query2 中的 SQL 语句复制并粘贴到 Query3 中。 请务必删除多余的分号并添加 UNION 关键字。 然后,你可以在数据表视图中查看结果。
-
在其中一个查询中添加排序子句,然后将 ORDER BY 语句粘贴到联合查询 SQL 视图中。 请注意,在即将追加排序时,Query3 中的联合查询会首先删除分号,然后从字段名称中删除表名。
-
合并和排序此联合查询示例名称的最终 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 显示以下五个示例记录:
就业 |
姓氏 |
名字 |
内部 |
Freehafer |
Nancy |
内部 |
Giussani |
Laura |
供应商 |
Glasson |
Stuart |
客户 |
Goldschmidt |
Daniel |
客户 |
Gratacos Solsona |
Antonio |
上面的查询可以进一步减少,因为 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];
切换到数据表视图,会看到以下类似结果:
就业 |
姓氏 |
名字 |
供应商 |
Andersen |
Elizabeth A. |
内部 |
Freehafer |
Nancy |
客户 |
Hasselberg |
Jonas |
内部 |
Hellung Larsen |
Anne |
供应商 |
Hernandez-Echevarria |
Amaya |
客户 |
Mortensen |
Sven |
供应商 |
Sandberg |
Mikael |
供应商 |
夏 |
蘅 |
内部 |
Thorpe |
Steven |
供应商 |
Weiler |
Cornelia |
内部 |
Zare |
Robert |
如果要联合的查询有很大不同,则可能会遇到输出字段必须合并不同类型数据的情况。 如果是这种情况,联合查询通常会将结果作为文本数据类型返回,因为该数据类型可以同时包含文本和数字。
为了解其工作原理,我们将使用 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 数据库中,产品 ID 为 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
这包含将总计添加到联合查询中的基础知识。 你可能还希望在两个查询中都包含固定值,如“详细信息”和“总计”,以便将总计记录与其他记录进行直观分离。 你可以参阅在合并查询中合并三个或更多表或查询部分了解如何使用固定值。
默认情况下,Access 中的联合查询只包含不同的记录。 但如果想要包含所有记录呢? 此处另一个示例可能很有用。
在上一部分,我们向你展示了如何在联合查询中创建总计。 修改该联合查询 SQL 以包含产品 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 示例数据库中显示两条记录的简单选择查询结果:
采购订单 ID |
产品 |
数量 |
100 |
Northwind Traders 巧克力 |
100 |
92 |
Northwind Traders 巧克力 |
100 |
在之前提到的联合查询中,可以看到未包含采购订单 ID 字段,并且这两个字段不构成两个不同的记录。
如果想要包含所有记录,请在 SQL 中使用 UNION ALL 而不是 UNION。 这很可能会对结果的排序产生影响,因此可能还需要包含 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 会对之前显示的九条记录执行联合(固定字段值为 <全部> 和“*”)。
由于此联合子句不包含 UNION ALL,因此 Access 只返回不同的记录,这意味着每个城市只返回一次固定的相同值。
-
现在,你已拥有一个城市名称仅显示一次的完整联合查询,以及一个可以有效选择所有城市的选项,你可以将此查询用作表单上组合框的记录源。 使用此特定示例作为模型,可以在表单上创建组合框控件,将此查询设置为其记录源,将“筛选”列的“列宽”属性设置为 0(零)以在视觉上隐藏它,然后将“绑定列”属性设置为 1 以指示第二列的索引。 在表单自身的“筛选器”属性中,可以添加如下代码,以使用组合框控件中选定内容的值激活表单筛选器:
Me.Filter = "[City] Like '" & Me![FilterComboBoxName].Value & "'" Me.FilterOn = True
然后,表单用户可以将表单记录筛选为特定的城市名称,或者选择 <全部> 以列出所有城市的所有记录。