使用子查询将查询嵌入到其他查询或表达式中

注意:  我们希望能够尽快以你的语言为你提供最新的帮助内容。 本页面是自动翻译的,可能包含语法错误或不准确之处。我们的目的是使此内容能对你有所帮助。可以在本页面底部告诉我们此信息是否对你有帮助吗? 请在此处查看本文的 英文版本 以便参考。

有时,您可能希望将一个查询的结果用作其他查询中的字段或用作查询字段的条件。例如,假设您想查看每类产品的订单之间的时间间隔。若要创建查询以显示此时间间隔,需要将同类产品的各个订单日期进行相互比较。比较这些订单日期时也需要查询。通过使用子查询,可以将此查询嵌入到主查询中。

在 表达式中,可以用SQL 视图或结构化查询语言 (SQL) 语句编写子查询。

本文内容

查询结果用作其他查询中的字段

将子查询用作条件的查询字段

您可以使用与子查询中的常见 SQL 关键字

将查询结果用作其他查询中的字段

为字段别名,您可以使用子查询。当您想要将子查询结果用作主查询中的字段将子查询用作字段别名。

注意: 用作字段别名的子查询不能返回多个字段。

您可以使用子查询字段别名显示依赖于当前行,这是不可能不使用子查询中的其他值的值。例如,让我们回到示例您想要查看您的产品的每个订单的时间间隔的位置。以确定此间隔,您需要将该产品的其他订单日期到每个订单日期进行比较。您可以创建查询,使用罗斯文 2007年模板显示此信息。

显示如何设置罗斯文 2007

  1. 单击“Microsoft Office 按钮Office 按钮图像 ,然后单击“新建”。

  2. 在左窗格中,在模板类别下单击本地模板

  3. 本地模板下单击罗斯文 2007年中,,然后单击创建

  4. 按照“罗斯文贸易”页(在“启动屏幕”对象选项卡上)上的说明打开数据库,然后关闭“登录对话框”窗口。

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

  2. “显示表”对话框中,单击“查询”选项卡,然后双击“产品订单数”

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

  4. 双击“产品 ID”字段和“订单日期”字段,以将这些字段添加到查询设计网格。

  5. 在该网格的“产品 ID”列的“排序”行中,选择“升序”

  6. 在该网格的“订单日期”列的“排序”行中,选择“降序”

  7. 在该网格的第三列中,右键单击“字段”行,然后单击快捷菜单上的“显示比例”

  8. “显示比例”对话框中,键入或粘贴以下表达式:

    Prior Date: (SELECT MAX([Order Date]) 
    FROM [Product Orders] AS [Old Orders]
    WHERE [Old Orders].[Order Date]
    < [Product Orders].[Order Date]
    AND [Old Orders].[Product ID]
    = [Product Orders].[Product ID])

    此表达式是子查询。对于每一行,该子查询都会选择略早于已经与此行建立联系的订单日期的最近的订单日期。请注意如何使用 AS 关键字创建表别名,以便将子查询中的值与主查询的当前行中的值进行比较。

  9. 在该网格的第四列的“字段”行中,键入以下表达式:

Interval: [Order Date]-[Prior Date]

此表达式将计算每个订单日期和使用以前我们使用子查询定义的日期值的该产品的先前订单日期之间的间隔。

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

    该查询将运行,并显示一个列表,列表中包含产品名称、订单日期、前一个订单日期以及订单日期之间的时间间隔。结果先按照“产品 ID”(升序)、再按照“订单日期”(降序)进行排序。

    注意: 因为“产品 ID”在默认情况下是查阅字段,所以 Access 会显示查阅值(在这种情况下是产品名称)而不是实际的“产品 ID”。尽管这样会更改显示的值,但不会更改排序顺序。

  2. 关闭罗斯文数据库。

返回页首

将子查询用作查询字段的条件

为字段条件,您可以使用子查询。当您想要使用子查询的结果将限制字段所显示的值将子查询用作字段条件。

例如,假设您要查看由销售代表员工处理的订单列表。若要生成此列表,需要将每个订单的员工 ID 与非销售代表员工的员工 ID 列表进行比较。若要创建此列表并将其用作字段条件,可以使用子查询,如下面的步骤所示:

  1. 打开罗斯文 2007.accdb 并启用其内容。

  2. 关闭登录窗体。

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

  4. “显示表”对话框的“表”选项卡上,双击“订单”“员工”

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

  6. 在“订单”表中,双击“员工 ID”字段、“订单 ID”字段和“订单日期”字段,以将其添加到查询设计网格中。在“员工”表中,双击“职务”字段以将其添加到设计网格。

  7. 右键单击“员工 ID”列的“条件”行,然后单击快捷菜单上的“显示比例”

  8. “显示比例”框中,键入或粘贴以下表达式:

    IN (SELECT [ID] FROM [Employees] 
    WHERE [Job Title]<>'Sales Representative')

    这是子查询。它选择其职务不是销售代表的员工的员工 ID,并且将结果集提供给主查询。主查询随后会检查“订单”表中的员工 ID 是否在该结果集中。

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

    该查询将运行,并且查询结果显示由非销售代表员工处理的订单列表。

返回页首

可在子查询中使用的常见 SQL 关键字

在子查询中可以使用的几个 SQL 关键字为:

注意: 此列表并不详尽。您可以在子查询中使用任何有效的 SQL 关键字,数据定义关键字除外。

  • ALL    在 WHERE 子句中使用 ALL,可以检索在与子查询返回的每个行进行比较时满足条件的行。

    例如,假设您要分析一所大学中的学生数据。学生必须维持最低 GPA,它随着专业的不同而不同。“专业”和“最低 GPA”存储在名为 Majors 的表中,相关的学生信息存储在名为 Student_Records 的表中。

    要查看相应专业中的每个学生都超过了最低 GPA 的专业(及其最低 GPA)的列表,可以使用以下查询:

    SELECT [Major], [Min_GPA] 
    FROM [Majors]
    WHERE [Min_GPA] < ALL
    (SELECT [GPA] FROM [Student_Records]
    WHERE [Student_Records].[Major]=[Majors].[Major]);
  • ANY    在 WHERE 子句中使用 ANY,可以检索在与子查询返回的至少一行进行比较时满足条件的行。

    例如,假设您要分析一所大学中的学生数据。学生必须维持最低 GPA,它随着专业的不同而不同。“专业”和“最低 GPA”存储在名为 Majors 的表中,相关的学生信息存储在名为 Student_Records 的表中。

    要查看相应专业中的任何学生都未达到最低 GPA 的专业(及其最低 GPA)的列表,可以使用以下查询:

    SELECT [Major], [Min_GPA] 
    FROM [Majors]
    WHERE [Min_GPA] > ANY
    (SELECT [GPA] FROM [Student_Records]
    WHERE [Student_Records].[Major]=[Majors].[Major]);

    注意: 您还可以使用 SOME 关键字达到同样的目的;SOME 关键字与 ANY 关键字意义相同。

  • EXISTS    在 WHERE 子句中使用 EXISTS 可以指示子查询至少应该返回一行。您还可以添加 NOT 作为 EXISTS 的前缀,以指示子查询不应该返回任何行。

    例如,以下查询返回在至少一个现有订单中存在的产品的列表:

    SELECT *
    FROM [Products]
    WHERE EXISTS
    (SELECT * FROM [Order Details]
    WHERE [Order Details].[Product ID]=[Products].[ID]);

    如果使用 NOT EXISTS,则该查询返回在现有所有订单中都不存在的产品的列表:

    SELECT *
    FROM [Products]
    WHERE NOT EXISTS
    (SELECT * FROM [Order Details]
    WHERE [Order Details].[Product ID]=[Products].[ID]);
  • IN    在 WHERE 子句中使用 IN 可以验证主查询的当前行中的某个值是子查询返回的结果集的一部分。您还可以添加 NOT 作为 IN 的前缀,以验证主查询的当前行中的某个值不是子查询返回的结果集的一部分。

    例如,以下查询返回由非销售代表员工处理的订单(以及订单日期)的列表:

    SELECT [Order ID], [Order Date]
    FROM [Orders]
    WHERE [Employee ID] IN
    (SELECT [ID] FROM [Employees]
    WHERE [Job Title]<>'Sales Representative');

    通过使用 NOT IN,可以按照以下方式编写同一查询:

    SELECT [Order ID], [Order Date]
    FROM [Orders]
    WHERE [Employee ID] NOT IN
    (SELECT [ID] FROM [Employees]
    WHERE [Job Title]='Sales Representative');

返回页首

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

此信息是否有帮助?

谢谢您的反馈!

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

×