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 子句列出了字段标识符 name、price、warranty_available 和 exclusive_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 子句都只有一个表。 |
返回页首
创建联合查询
创建联合查询有两种基本方法:
在大多数情况下,您都应该先创建选择查询,然后再将它们合并为一个联合查询。在 Office Access 2007 中,“设计”视图提供了一种易用的创建选择查询的图形用户界面,您可以复制这些查询的 SQL 语句并将它们粘贴到联合查询中。
但是,如果您认为编写 SQL 语句得心应手,或者希望获得更多的 SQL 编写体验,则可能更倾向于直接在 SQL 视图中创建联合查询。
您要做什么?
先在“设计”视图中创建选择查询,然后合并它们
直接在 SQL 视图中创建联合查询
先在“设计”视图中创建选择查询,然后合并它们
按照此方法,将先使用“设计”视图创建每个选择查询,然后使用 SQL 视图合并选择查询。
在“设计”视图中创建每个选择查询
1. | 在“创建”选项卡上的“其他”组中,单击“查询设计”。 |
2. | 在“显示表”对话框中,双击要包括的字段所在的表。 |
这会将该表添加到查询设计窗口。
注释 虽然您可以在选择查询中包括多个表或查询,但此过程假定每个选择查询只包括一个表中的数据。
选择字段时,请确保您在其他选择查询中以相同顺序添加了相同数目的字段。另外,请注意各个字段的数据类型,确保在要合并的其他查询中,处于相应位置的字段具有兼容的数据类型。
例如,如果第一个选择查询具有五个字段,且第一个字段包含“日期/时间”数据,请确保要合并的其他每个选择查询也具有五个字段,并且第一个字段同样包含“日期/时间”数据,依此类推。
6. | 在添加完字段和字段条件后,应运行选择查询并查看其输出。 |
✍ | 在“设计”选项卡上的“结果”组中,单击“运行”。 |
在 SQL 视图中合并选择查询
1. | 在“创建”选项卡上的“其他”组中,单击“查询设计”。 |
在“设计”视图中打开一个新查询。
3. | 在“设计”选项卡上的“查询”组中,单击“联合”。 |
将隐藏查询设计窗口,并显示 SQL 视图对象选项卡。此时,SQL 视图对象选项卡中没有任何内容。
4. | 单击要合并在联合查询中的第一个选择查询的选项卡。 |
5. | 在“开始”选项卡上的“视图”组中,单击“视图”,然后单击“SQL 视图”。 |
将显示该选择查询的 SQL 语句。
7. | 单击此过程在步骤 1 中开始创建的联合查询的选项卡。 |
8. | 将选择查询的 SQL 语句粘贴到联合查询的 SQL 视图对象选项卡中。 |
9. | 删除选择查询 SQL 语句末尾的分号 (;)。 |
10. | 按 Enter 将光标移到下一行,然后在新行中键入 UNION。 |
您也可以再在其后键入一个空格,跟着键入 ALL 关键字,然后再次按 Enter。
11. | 单击要合并到联合查询中的下一个选择查询的选项卡。 |
12. | 请重复此过程的步骤 5 到步骤 11,直至将选择查询的所有 SQL 语句都通过复制和粘贴的方式添加到联合查询的 SQL 视图窗口中。对于最后一个选择查询的 SQL 语句,请勿删除其分号或键入任何内容。 |
13. | 在“设计”选项卡上的“结果”组中,单击“运行”。 |
联合查询的结果将显示在“数据表”视图 (数据表视图:以行列格式显示来自表、窗体、查询、视图或存储过程中的数据的视图。在数据表视图中,可以编辑字段、添加和删除数据,以及搜索数据。)中。
直接在 SQL 视图中创建联合查询
以下过程将引导您完成在 SQL 视图中创建基本联合查询的步骤。
1. | 在“创建”选项卡上的“其他”组中,单击“查询设计”。 |
在“设计”视图中打开一个新查询。
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。 |
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 函数提取四个字符的年的后两位数字。 |
3. | 在“创建”选项卡上的“其他”组中,单击“查询设计”。 |
注释 如果消息栏中显示了安全警告,则说明可能禁用了生成表查询等动作查询。要允许动作查询运行,请单击消息栏上的“选项”,然后在“Microsoft Office 安全选项”中单击“启用此内容”。
6. | 在查询设计网格中,双击联合查询对象选项卡上的星号 (*),以使用联合查询的所有字段创建新表。 |
- 或 -
双击要在新表中使用的每个字段。
7. | 在“设计”选项卡上的“查询类型”组中,单击“生成表”。 |
8. | 在“生成表”对话框中,为新表键入一个名称。您还可以指定另一个数据库来创建新表。完成后请单击“确定”。 |
9. | 在“设计”选项卡上的“结果”组中,单击“运行”。 |
使用联合查询执行完全外部联接:
| 在要用于完全外部联接的字段上创建一个具有左外部联接的查询。 |
| 在“开始”选项卡上的“视图”组中,单击“视图”,然后单击“SQL 视图”。 |
| 删除 FROM 子句末尾的分号,然后按 Enter。 |
注释 在使用联合查询执行完全外部联接时,请勿使用 ALL 关键字。
| 按 Ctrl+V 粘贴您在步骤 3 中复制的 SQL 代码。 |
| 在粘贴的代码中,将 LEFT JOIN 更改为 RIGHT JOIN。 |
| 删除第二个 FROM 子句末尾的分号,然后按 Enter。 |
| 添加一个 WHERE 子句,将 FROM 子句中列出的第一个表(左表)中的联接字段值更改为 NULL。 |
例如,如果 FROM 子句为:
FROM Products RIGHT JOIN [Order Details]
ON Products.ID = [Order Details].[Product ID]
则应添加以下 WHERE 子句:
WHERE Products.ID IS NULL
| 在 WHERE 子句的末尾键入一个分号 (;),以指示联合查询已达末尾。 |
返回页首