使用联合查询将多个查询合并到单个结果中

使用联合查询将多个查询合并到单个结果中

重要:  本文是由机器翻译的,请参阅免责声明。请在 此处 中查找本文的英文版本以便参考。

假设 Access 数据库中包含两个不相关的表(一个表存储客户数据,另一个表存储有关供应商的数据),并且这两个表都有一个联系人信息字段。你希望使用一个视图查看这两个表中的联系人信息。为此,请首先为每个表创建一个选择查询以检索联系人信息,然后通过创建联合查询来合并这些结果。

注意: 本文中的内容适用于 Access 桌面数据库。不能在 Access Web 数据库或 Access Web 应用中创建或使用联合查询。

需要刷新器以创建基本选择查询?请参阅创建简单的选择查询

首先需要了解有关创建联合查询的几项事项:

  • 联合查询中合并的选择查询必须具有相同的输出字段数、采用相同的顺序并包含相同或兼容的数据类型。在运行联合查询时,来自每组相应字段中的数据将合并到一个输出字段中,这样查询输出所包含的字段数将与每个 Select 语句相同。

  • 联合查询特定于 SQL,因此必须直接用 SQL 编写。您将切换到 SQL 视图以编写特定于 SQL 的查询,包括联合查询。

步骤 1:创建选择查询

注意: 虽然您可以在查询中包括多个表或查询,但此过程假定每个选择查询只包括一个表中的数据。

  1. “创建”选项卡上的“查询”组中,单击“查询设计”

  2. 在“显示表”对话框中,双击要包括的字段所在的表。这会将该表添加到查询设计窗口。

  3. 关闭“显示表”对话框。

  4. 在查询设计窗口中,双击要包括的每个字段。
    选择字段时,请确保您在其他选择查询中以相同顺序添加了相同数目的字段。另外,请注意各个字段的数据类型,确保在要合并的其他查询中,处于相应位置的字段具有兼容的数据类型。例如,如果第一个选择查询具有五个字段,且第一个字段包含“日期/时间”数据,请确保要合并的其他每个选择查询也具有五个字段,并且第一个字段同样包含“日期/时间”数据,依此类推。

  5. 另外,你还可以在字段网格的“条件”行中键入适当的表达式,从而向字段中添加条件。

  6. 添加完字段和字段条件后,应运行选择查询并查看其输出。在“设计”选项卡上的“结果”组中,单击“运行”。

  7. 将查询切换到“设计”视图。

  8. 保存该选择查询,但不要将其关闭。

  9. 对于要合并的每个选择查询,请重复此过程。

有关在查询中使用条件的详细信息,请参阅将条件应用到查询

步骤 2:合并选择查询

在此步骤中,将使用 SQL 语句创建联合查询。(有关详细信息,请参阅下面的 SQL 语法部分。)

  1. “创建”选项卡上的“查询”组中,单击“查询设计”

  2. 关闭“显示表”对话框。

  3. 在“设计”选项卡上的“查询”组中,单击“联合”。

Access 将隐藏查询设计窗口并显示 SQL 视图对象选项卡。此时,SQL 视图对象选项卡中没有任何内容。

  1. 单击要合并在联合查询中的第一个选择查询的选项卡。

  2. 在“开始”选项卡上,单击“视图”>“SQL 视图”。

  3. 复制该选择查询的 SQL 语句。单击在步骤 1 中开始创建的联合查询的选项卡。

  4. 将选择查询的 SQL 语句粘贴到联合查询的 SQL 视图对象选项卡中。

  5. 删除选择查询 SQL 语句末尾的分号 (;)。

  6. 按 Enter 将光标移到下一行,然后在新行中键入 UNION

  7. 单击要合并到联合查询中的下一个选择查询的选项卡。

  8. 请重复步骤 5 到步骤 10,直至将选择查询的所有 SQL 语句都通过复制和粘贴的方式添加到联合查询的 SQL 视图窗口中。对于最后一个选择查询的 SQL 语句,请勿删除其分号或键入任何内容。

  9. “设计”选项卡上的“结果”组中,单击“运行”

联合查询的结果将显示在数据表视图中。

返回页首

使用联合查询的提示

  • 如果您希望能够辨别各个行分别来自哪个表,可以在每个 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 函数提取四个字符的年的后两位数字。

使用联合查询的结果创建新表

首先将联合查询用作新选择查询的输入,然后使用该选择查询作为生成表查询的基准,如下列步骤所示:

  1. 创建并保存该联合查询。

  2. “创建”选项卡上的“查询”组中,单击“查询设计”

  3. 在“显示表”对话框中,单击“查询”选项卡。

  4. 双击该联合查询,然后关闭“显示表”对话框。

    注意: 如果您在消息栏中看到安全警告,说明可能已禁用了动作查询。若要启用动作查询,请单击消息栏上的“启用内容”。

  5. 在查询设计网格中,双击联合查询对象选项卡上的星号 (*),以使用联合查询的所有字段创建新表。

  6. 在“设计”选项卡上的“查询类型”组中,单击“生成表”。

  7. “生成表”框中,键入新表的名称。

  8. 或者指定用于在其中创建表的其他数据库。

  9. 单击“确定”。

  10. 在“设计”选项卡上的“结果”组中,单击“运行”。

使用联合查询执行完全外部联接

您可以使用联合查询执行完全外部联接。完全外部联接并不限制从每个联接表中返回的行,但会根据联接字段中的值合并这些行。

  1. 在要用于完全外部联接的字段上创建一个具有左外部联接的查询。

  2. 在“开始”选项卡上的“视图”组中,单击“视图”,然后单击“SQL 视图”。

  3. 按 Ctrl+C 复制 SQL 代码。

  4. 删除 FROM 子句末尾的分号,然后按 Enter。

  5. 键入 UNION,然后按 Enter。

    注意: 在使用联合查询执行完全外部联接时,请勿使用 ALL 关键字。

  6. 按 Ctrl+V 粘贴您在步骤 3 中复制的 SQL 代码。

  7. 在粘贴的代码中,将 LEFT JOIN 更改为 RIGHT JOIN

  8. 删除第二个 FROM 子句末尾的分号,然后按 Enter。

  9. 添加一个 WHERE 子句,将 FROM 子句中列出的第一个表(左表)中的联接字段值更改为 NULL。

    例如,如果 FROM 子句为:

    FROM Products RIGHT JOIN [Order Details] 
    ON Products.ID = [Order Details].[Product ID]

    您可以添加以下 WHERE 子句:

    WHERE Products.ID IS NULL

  10. 在 WHERE 子句的末尾键入一个分号 (;),以指示联合查询已达末尾。

  11. 在“设计”选项卡上的“结果”组中,单击“运行”。
    联合查询的结果将显示在数据表视图中。

有关详细信息,请参阅联接表和查询

返回页首

联合查询的要求和 SQL 语法

联合查询的一些要求

  • 联合查询中合并的选择查询必须具有相同的输出字段数、采用相同的顺序并包含相同或兼容的数据类型。在运行联合查询时,来自每组相应字段中的数据将合并到一个输出字段中,这样查询输出所包含的字段数将与每个 Select 语句相同。

    注意: 根据联合查询的目的,“数字”和“文本”数据类型兼容。

  • 联合查询特定于 SQL,因此必须直接用 SQL 编写。您将切换到 SQL 视图以编写特定于 SQL 的查询,包括联合查询。

联合查询的 SQL 语法

在联合查询中,每个选择查询(也称为 SELECT 语句)具有以下子句:

子句

包含一列...

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 子句列出了字段标识符 namepricewarranty_availableexclusive_offer

FROM Products

第一个 FROM 子句

FROM 子句跟在 SELECT 子句之后,二者共同构成了一个基本的 SELECT 语句。

FROM 后面跟有一列标识符,用于指示哪些表中包含 SELECT 子句中列出的字段。

FROM 子句必须至少列出一个表。

此 FROM 子句列出了表标识符 Products

UNION ALL

UNION 关键字以及可选的 ALL 关键字

SELECT 语句的结果将 UNION 前后的 SELECT 语句的结果合并在一起。

在使用 ALL 关键字时,联合查询结果中并不删除重复行。

通过使用 ALL 关键字,查询可以更快地运行,因为 Access 不必检查重复行。

如果满足下列任何条件,请使用 ALL 关键字:

  • 您确定选择查询不会生成任何重复行。

  • 结果中有重复行对您无关紧要。

  • 您希望查看重复行。

SELECT name, price, guarantee_available, exclusive_offer

第二个 SELECT 子句

一些规则:

  • 第二个 SELECT 子句需要与第一个 SELECT 子句具有相同数量的字段。

  • 具有共同数据的字段需要以相同的顺序显示在子句中。

  • 具有共同数据的字段需要具有相同或兼容的数据类型。

注意: 联合查询输出中的字段名称来自第一个 SELECT 子句。因此,在我们的示例的查询输出中,来自字段“warranty_available”和“guarantee_available”的数据将被命名为“warranty_available”。

FROM Services

第二个 FROM 子句

联合查询中的 FROM 子句对表没有限制。您既可以创建在每个 FROM 子句中都使用相同表的联合查询, 也可以在 FROM 子句中使用不同数目的表。在我们的示例中,每个 FROM 子句都只有一个表。

返回页首

注意: 机器翻译免责声明:本文是由无人工介入的计算机系统翻译的。Microsoft 提供机器翻译是为了帮助非英语国家/地区用户方便阅读有关 Microsoft 产品、服务和技术的内容。由于机器翻译的原因,本文可能包含词汇、语法或文法方面的错误。

扩展你的技能
了解培训
抢先获得新功能
加入 Office 预览体验计划

此信息是否有帮助?

谢谢您的反馈!

谢谢你的反馈! 可能需要转接到 Office 支持专员。

×