国内最全IT社区平台 联系我们 | 收藏本站
华晨云阿里云优惠2
您当前位置:首页 > 数据库 > access > Access 2007使用联合查询合并多个选择查询的结果

Access 2007使用联合查询合并多个选择查询的结果

来源:程序员人生   发布时间:2014-01-01 01:45:51 阅读次数:3753次

对于多个相似的选择查询,当您希望将它们返回的所有数据一起作为一个合并的集合查看时,便可以使用联合查询。

本文将向您介绍如何根据两个或多个现有的选择查询创建联合查询,同时说明如何使用结构化查询语言 (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 子句列出了字段标识符 namepricewarranty_availableexclusive_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 子句都只有一个表。

 

创建联合查询

创建联合查询有两种基本方法:

  • 先在查询“设计”视图 (设计视图:显示数据库对象(包括:表、查询、窗体、宏和数据访问页)的设计的窗口。在设计视图中,可以新建数据库对象和修改现有数据库对象的设计。)中创建各个组件选择查询,然后将这些查询合并为一个联合查询。
  • 直接在 SQL 视图 (SQL 视图:用于显示当前查询的 SQL 语句或用于创建 SQL 特有查询(联合查询、传递查询或数据定义查询)的窗口。在设计视图中创建查询时,Access 会在 SQL 视图中构建 SQL 的等价查询。)中创建整个联合查询。

在大多数情况下,您都应该先创建选择查询,然后再将它们合并为一个联合查询。在 Office Access 2007 中,“设计”视图提供了一种易用的创建选择查询的图形用户界面,您可以复制这些查询的 SQL 语句并将它们粘贴到联合查询中。

但是,如果您认为编写 SQL 语句得心应手,或者希望获得更多的 SQL 编写体验,则可能更倾向于直接在 SQL 视图中创建联合查询。


先在“设计”视图中创建选择查询,然后合并它们

按照此方法,将先使用“设计”视图创建每个选择查询,然后使用 SQL 视图合并选择查询。

在“设计”视图中创建每个选择查询

  1. “创建”选项卡上的“其他”组中,单击“查询设计”
  2. “显示表”对话框中,双击要包括的字段所在的表。

    这会将该表添加到查询设计窗口。

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

  3. 关闭“显示表”对话框。
  4. 在查询设计窗口中,双击要包括的每个字段。

    选择字段时,请确保您在其他选择查询中以相同顺序添加了相同数目的字段。另外,请注意各个字段的数据类型,确保在要合并的其他查询中,处于相应位置的字段具有兼容的数据类型。

    例如,如果第一个选择查询具有五个字段,且第一个字段包含“日期/时间”数据,请确保要合并的其他每个选择查询也具有五个字段,并且第一个字段同样包含“日期/时间”数据,依此类推。

  5. 另外,您还可以在字段网格的“条件”行中键入适当的表达式 (表达式:算术或逻辑运算符、常数、函数和字段名称、控件和属性的任意组合,计算结果为单个值。表达式可执行计算、操作字符或测试数据。),以此向字段中添加条件。
  6. 在添加完字段和字段条件后,应运行选择查询并查看其输出。
    • “设计”选项卡上的“结果”组中,单击“运行”
  7. 将查询切换到“设计”视图。
  8. 保存该选择查询,但不要将其关闭。
  9. 对于要合并的每个选择查询,请重复此过程。

在 SQL 视图中合并选择查询

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

    在“设计”视图中打开一个新查询。

  2. 关闭“显示表”对话框。
  3. “设计”选项卡上的“查询”组中,单击“联合”

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

  4. 单击要合并在联合查询中的第一个选择查询的选项卡。
  5. “开始”选项卡上的“视图”组中,单击“视图”,然后单击“SQL 视图”

    将显示该选择查询的 SQL 语句。

  6. 复制该选择查询的 SQL 语句。
  7. 单击此过程在步骤 1 中开始创建的联合查询的选项卡。
  8. 将选择查询的 SQL 语句粘贴到联合查询的 SQL 视图对象选项卡中。
  9. 删除选择查询 SQL 语句末尾的分号 (;)。
  10. 按 Enter 将光标移到下一行,然后在新行中键入 UNION

    您也可以再在其后键入一个空格,跟着键入 ALL 关键字,然后再次按 Enter。

  11. 单击要合并到联合查询中的下一个选择查询的选项卡。
  12. 请重复此过程的步骤 5 到步骤 11,直至将选择查询的所有 SQL 语句都通过复制和粘贴的方式添加到联合查询的 SQL 视图窗口中。对于最后一个选择查询的 SQL 语句,请勿删除其分号或键入任何内容。
  13. “设计”选项卡上的“结果”组中,单击“运行”

    联合查询的结果将显示在“数据表”视图 (数据表视图:以行列格式显示来自表、窗体、查询、视图或存储过程的窗口。在数据表视图中,可以编辑字段、添加和删除数据,以及搜索数据。)中。

直接在 SQL 视图中创建联合查询

以下过程将引导您完成在 SQL 视图中创建基本联合查询的步骤。

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

    在“设计”视图中打开一个新查询。

  2. 关闭“显示表”对话框。
  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。
  12. 请键入 ; 指示查询的末尾。
  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 函数提取四个字符的年的后两位数字。
  • 如果要使用某个联合查询的输出创建一个新表,可以将该联合查询用作一个新选择查询的输入,然后再将该选择查询用作生成表查询 (生成表查询:一种查询(SQL 语句),它创建一个新表,然后通过从一个现有表中复制记录,在新表中创建记录(行)。)的基础:
    •  

      1. 创建并保存该联合查询。
      2. “创建”选项卡上的“其他”组中,单击“查询设计”
      3. “显示表”对话框中,单击“查询”选项卡。
      4. 双击该联合查询,然后关闭“显示表”对话框。

         注释   如果消息栏中显示了安全警告,则说明可能禁用了生成表查询等动作查询。要允许动作查询运行,请单击消息栏上的“选项”,然后在“Microsoft Office 安全选项”中单击“启用此内容”

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

        -或-

        双击要在新表中使用的每个字段。

      6. “设计”选项卡上的“查询类型”组中,单击“生成表”
      7. “生成表”对话框中,为新表键入一个名称。您还可以指定另一个数据库来创建新表。完成后请单击“确定”
      8. “设计”选项卡上的“结果”组中,单击“运行”

       

  • 您可以使用联合查询执行完全外部联接 (外部联接:在这种联接中,两个表中的每条匹配记录都在查询结果中合并为一条记录,并且其中一个表贡献出它的所有记录,即使联接字段中的值与对方表中的字段不匹配也是如此。)。完全外部联接并不限制从每个联接表中返回的行,但会根据联接字段中的值合并这些行。

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

    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. “设计”选项卡上的“结果”组中,单击“运行”
生活不易,码农辛苦
如果您觉得本网站对您的学习有所帮助,可以手机扫描二维码进行捐赠
程序员人生
------分隔线----------------------------
分享到:
------分隔线----------------------------
关闭
程序员人生