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

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

在 <token>TE000127167</token>中,可以用<token>TE000126761</token>或结构化查询语言 (SQL) 语句编写子查询。

本文内容

<link xlink:href="a8532322-e42f-4f94-bc38-ace7c182916a#bm1">将查询结果用作其他查询的字段</link>

<link xlink:href="a8532322-e42f-4f94-bc38-ace7c182916a#bm2">将子查询用作查询字段的条件</link>

<link xlink:href="a8532322-e42f-4f94-bc38-ace7c182916a#bm3">可在子查询中使用的常见 SQL 关键字</link>

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

可以将子查询用作字段别名。如果您希望将子查询结果用作主查询中的字段,则可以使用子查询作为字段别名。

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

可以使用子查询字段别名显示依赖于当前行中的其他值的值,如果不使用子查询,则无法做到这一点。

例如,让我们回到您要查看每类产品的订单之间的时间间隔的示例。若要确定此时间间隔,需要将同类产品的各个订单日期进行相互比较。通过使用罗斯文数据库模板,可以创建显示此信息的查询。

  1. 在<ui>“文件”</ui>选项卡上,单击<ui>“新建”</ui>。

  2. 在<ui>“可用模板”</ui>下,单击<ui>“样本模板”</ui>。

  3. 单击<ui>“罗斯文”</ui>,然后单击<ui>“创建”</ui>。

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

  5. 在<ui>“创建”</ui>选项卡上的<ui>“查询”</ui>组中,单击<ui>“查询设计”</ui>。

  6. 在<ui>“显示表”</ui>对话框中,单击<ui>“查询”</ui>选项卡,然后双击<ui>“产品订单数”</ui>。

  7. 关闭<ui>“显示表”</ui>对话框。

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

  9. 在该网格的<ui>“产品 ID”</ui>列的<ui>“排序”</ui>行中,选择<ui>“升序”</ui>。

  10. 在该网格的<ui>“订单日期”</ui>列的<ui>“排序”</ui>行中,选择<ui>“降序”</ui>。

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

  12. 在<ui>“显示比例”</ui>对话框中,键入或粘贴以下表达式:

    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 关键字创建表别名,以便将子查询中的值与主查询的当前行中的值进行比较。

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

    <codeInline>Interval: [Order Date]-[Prior Date]</codeInline>

    此表达式使用通过子查询定义的前一个日期的值来计算同类产品的每个订单日期与前一个订单日期之间的时间间隔。<br />

  14. 在<ui>设计</ui>选项卡上的<ui>结果</ui>组中,单击<ui>运行</ui>。

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

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

  15. 关闭罗斯文数据库。

<link xlink:href="a8532322-e42f-4f94-bc38-ace7c182916a#__top">返回页首</link>

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

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

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

  1. 打开 Northwind.accdb,并启用其内容。

  2. 关闭登录窗体。

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

  4. 在<ui>“显示表”</ui>对话框的<ui>“表”</ui>选项卡上,双击<ui>“订单”</ui>和<ui>“员工”</ui>。

  5. 关闭<ui>“显示表”</ui>对话框。

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

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

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

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

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

  9. 在<ui>“设计”</ui>选项卡上的<ui>“结果”</ui>组中,单击<ui>“运行”</ui>。

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

<link xlink:href="a8532322-e42f-4f94-bc38-ace7c182916a#__top">返回页首</link>

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

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

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

  • <embeddedLabel>ALL</embeddedLabel> 在 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]);
  • <embeddedLabel>ANY</embeddedLabel> 在 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 关键字意义相同。

  • <embeddedLabel>EXISTS</embeddedLabel> 在 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]);
  • <embeddedLabel>IN</embeddedLabel> 在 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');

<link xlink:href="a8532322-e42f-4f94-bc38-ace7c182916a#__top">返回页首</link>

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

此信息是否有帮助?

谢谢您的反馈!

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

×