有时,在 Access 中生成和使用查询的过程非常简单,只需从表中选择字段(可能需要应用条件),然后查看结果。 但在通常情况下,如果需要的数据分布在多个表中怎么办? 幸运的是,可以生成能够合并多个源中的信息的查询。 本主题将介绍从多个表中提取数据的一些方案,并演示其操作方法。
希望执行什么操作?
使用相关表中的数据增强查询中的信息
有时可能会遇到这种情况:基于某个表的查询向你提供所需信息,但从另一个表中提取数据将有助于使查询结果更清晰、更有用。 例如,假定查询结果中显示了员工 ID 列表。 你意识到在结果中查看员工姓名会更有用,但员工姓名位于另一个表中。 为了使员工姓名显示在查询结果中,需要在查询中包含这两个表。
使用查询向导从主表和相关表生成查询
-
确保表在“关系”窗口中包含已定义的关系。
操作方法
-
在“数据库工具”选项卡上的“显示/隐藏”组中,单击“关系”。
-
在“设计”选项卡上的“关系”组中,单击“所有关系”。
-
确定应包含已定义关系的表。
-
如果表在“关系”窗口中可见,则查看是否已对关系进行定义。
关系在公共字段中显示为连接两个表的行。 可双击关系行,查看表中哪些字段由关系连接。
-
如果表在“关系”窗口中不可见,则必须添加表。
在“设计”选项卡上的“显示/隐藏”组中,单击“表名称”。
双击要显示的每个表,然后单击“关闭”。
-
-
如果未找到两个表之间的关系,则通过将一个表中的字段拖动到另一个表中的字段来创建一个关系。 在其上创建两表之间关系的字段必须具有相同的数据类型。
注意: 如果字段大小为长整型,则可在“自动编号”数据类型字段和“数字”数据类型字段之间创建关系。 创建一对多关系时,通常会发生这种情况。
“编辑关系”对话框随即出现。
-
单击“创建”以创建关系。
若要深入了解创建关系时可用的选项,请参阅创建、编辑或删除关系一文。
-
关闭“关系”窗口。
-
-
在“创建”选项卡的“查询”组中,单击“查询向导”。
-
在“新建查询”对话框中,单击“简单查询向导”,然后单击“确定”。
-
在“表/查询”组合框中,单击包含查询中所需基本信息的表。
-
在“可用字段”列表中,单击要包含在查询中的第一个字段,然后单击单向右键按钮,将该字段移动到“所选字段”列表。 针对要包含在查询内的表中所有其他字段,执行相同的操作。 这些字段可以是要在查询输出中返回的字段,也可以是要用于通过应用条件限制输出行数的字段。
-
在“表/查询”组合框中,单击包含要用于增强查询结果的相关数据的表。
-
将要用于增强查询结果的字段添加到“所选字段”列表,然后单击“下一步”。
-
在“请确定采用明细查询还是汇总查询:”下,单击“明细”或“汇总”。
如果不希望查询执行任何聚合函数(Sum、Avg、Min、Max、Count、StDev或Var),请选择明细查询。 如果希望查询执行聚合函数,请选择汇总查询。 完成选择之后,单击“下一步”。
-
单击“完成”查看结果。
使用 Northwind 示例数据库的示例
在以下示例中,使用“查询向导”生成查询,查询中可显示订单列表、每个订单的运费以及处理每个订单的员工姓名。
注意: 以下示例涉及对 Northwind 示例数据库进行修改。 可能需要备份 Northwind 示例数据库,然后使用该备份副本执行以下示例。
使用“查询向导”生成查询
-
打开 Northwind 示例数据库。 关闭登录窗体。
-
在“创建”选项卡的“查询”组中,单击“查询向导”。
-
在“新建查询”对话框中,单击“简单查询向导”,然后单击“确定”。
-
在“表/查询”组合框中,单击“表: 订单”。
-
在“可用字段”列表中,双击“订单 ID”,将该字段移动到“所选字段”列表。 双击“运费”,将该字段移动到“所选字段”列表。
-
在“表/查询”组合框中,单击“表: 员工”。
-
在“可用字段”列表中,双击“名字”,将该字段移动到“所选字段”列表。 双击“姓氏”,将该字段移动到“所选字段”列表。 单击“下一步”。
-
由于要创建所有订单的列表,因此需要使用明细查询。 如果按员工汇总运费或执行某些其他的聚合函数,则应使用汇总查询。 单击“明细(显示每个记录的每个字段)”,然后单击“下一步”。
-
单击“完成”查看结果。
该查询会返回一个订单列表,每个订单都包含运费金额和处理该订单的员工姓名。
使用两个表与第三个表的关系连接两个表中的数据
一般情况下,两个表中的数据通过第三个表彼此关联。 这通常是因为前两个表之间的数据以多对多关系相关联。 一般情况下,设计数据库的最佳做法是将两个表之间的多对多关系拆分为两个涉及三个表的一对多关系。 为此,可创建名为联接表或关系表的第三个表,该表应具有其他每个表的主键和外键。 然后在联接表的每个外键和任一其他表的相应主键之间创建一对多关系。 在这种情况下,需要在查询中包含全部的三个表,即使只想从其中两个表中检索数据。
使用具有多对多关系的表生成选择查询
-
在“创建”选项卡上的“查询”组中,单击“查询设计”。
-
双击包含要包含在查询中的数据的两个表,以及链接它们的交接点表,然后单击“ 关闭”。
所有三个表都将显示在查询设计工作区中,并在相应字段进行联接。
-
双击要在查询结果中使用的各个字段。 然后每个字段会显示在查询设计网格中。
-
在查询设计网格中,使用“条件”行输入字段条件。 若要使用字段条件但在查询结果中不显示该字段,请清除该字段“显示”行中的复选框。
-
若要根据字段中的值对结果进行排序,请在查询设计网格中,单击该字段“排序”行中的“升序”或“降序”(具体取决于要对记录进行排序的方式)。
-
在“设计”选项卡上的“结果”组中,单击“运行”。
Access 将在数据表视图中显示查询输出。
使用 Northwind 示例数据库的示例
注意: 以下示例涉及对 Northwind 示例数据库进行修改。 可能需要备份 Northwind 示例数据库,然后使用备份副本执行以下示例。
假定你获得一个新的商机:里约热内卢的供应商找到了你的网站,并且可能想要与你合作。 但是,他们只在里约热内卢和圣保罗附近经营业务。 他们能够提供你所代理的每一类食品。 他们是一家相当大的公司,并希望你保证能够为他们提供足够的潜在销售收入,这次合作才算值得:每年的销售额至少达到 R$20,000.00(约 $9,300.00)。 你能为他们提供所需的市场吗?
回答这个问题所需的数据可在以下两个位置中找到:“客户”表和“订单明细”表。 这两个表通过“订单”表相互链接。 这两个表之间的关系已经定义。 在“订单”表中,每个订单只能有一个客户,该客户与“客户”表中的“客户 ID”字段关联。 “订单明细”表中的每个记录都与“订单”表中“订单 ID”字段的唯一订单关联。 因此,一个给定的客户可以有多个订单,其中每个订单有多个订单明细。
在此示例中,将生成交叉表查询,其中显示每年在里约热内卢和圣保罗的总销售额。
在设计视图中生成查询
-
打开 Northwind 数据库。 关闭登录窗体。
-
在“创建”选项卡上的“查询”组中,单击“查询设计”。
-
双击“ 客户”、“ 订单”和“订单详细信息”。
所有三个表都将显示在查询设计工作区中。
-
在“客户”表中,双击“城市”字段将其添加到查询设计网格中。
-
在查询设计网格的“城市”列、“条件”行中,键入“位于("里约热内卢","圣保罗")”。 这样可使查询中只包括位于这两个城市之一的客户的记录。
-
在“订单明细”表中,双击“发货日期”和“单价”字段。
这些字段将添加到查询设计网格中。
-
在查询设计网格的“发货日期”列中,选择“字段”行。 将“[ShippedDate]”替换为“Year:Format([ShippedDate],"yyyy")”。 这将创建一个字段别名“年”,以便仅在“发货日期”字段中使用该值的年份部分。
-
在查询设计网格的“单价”列中,选择“字段”行。 将“[UnitPrice]”替换为“Sales: [Order Details].[UnitPrice]*[Quantity]-[Order Details].[UnitPrice]*[Quantity]*[Discount]”。 这将创建字段别名“销售额”,以便计算每个记录的销售额。
-
在“设计”选项卡的“查询类型”组中,单击“交叉表”。
两个新行“汇总”和“交叉表”都将显示在查询设计网格中。
-
在查询设计网格的“城市”列中,依次单击“交叉表”行和“行标题”。
这会使城市值显示为行标题(也就是说,查询为每个城市返回一行)。
-
在“年”列中,单击“交叉表”行,然后单击“列标题”。
这会使年值显示为列标题(也就是说,查询为每年返回一列)。
-
在“销售额”列中,单击“交叉表”行,然后单击“值”。
这会使销售额值显示在行和列的交叉处(也就是说,查询为每个城市和年份的组合返回一个销售额值)。
-
在“销售额”列中,单击“汇总”行,然后单击“求和”。
这会使查询对此列中的值进行汇总。
由于需要查看这些列中的每个值而不是汇总值,因此可将其余两列的“汇总”行保留为“分组依据”的默认值。
-
在“设计”选项卡上的“结果”组中,单击“运行”。
此时将出现返回里约热内卢和圣保罗年销售总额的查询。
查看两个相似表中的所有记录
有时,可能需要将结构相同、但其中一个表位于另一个数据库中的两个表中的数据进行合并。 请考虑以下情形。
假设你是一位正在处理学生数据的分析师。 你正在着手解决你的学校和另一个学校之间的数据共享问题,以便两个学校都能够改进课程计划。 对于要解决的一些问题,同时查看两个学校的所有记录要比单独查看每个学校的记录更为妥当。
你可以将另一个学校的数据导入数据库的新表中,但是该学校的数据随后发生的任何更改都不会反映在你的数据库中。 更好的方法是链接到该学校的表,然后创建能够在运行时合并数据的查询。 可将数据作为一组进行分析,而不是执行两次分析并尝试将其解释为一个整体。
若要查看结构相同的两个表中的所有记录,请使用联合查询。
联合查询无法在设计视图中显示。 可使用在 SQL 视图对象选项卡中输入的 SQL 命令生成上述查询。
使用两个表创建联合查询
-
在“创建”选项卡上的“查询”组中,单击“查询设计”。
-
在“设计”选项卡上的“查询类型”组中,单击“联合”。
查询随即从设计视图切换到 SQL 视图。 此时,SQL 视图对象选项卡为空。
-
在 SQL 视图中,键入“SELECT”,后跟要包含在查询中的第一个表中的字段列表。 应使用方括号将字段名括起来,并用逗号分隔。 键入完字段名后,按 Enter。 光标在 SQL 视图中向下移动一行。
-
键入“FROM”,后跟要包含在查询中的第一个表的名称。 按 Enter。
-
若要为第一个表中的字段指定条件,请键入“WHERE”,后跟字段名、比较运算符(通常为等号 (=))和条件。 可使用 AND 关键字和第一个条件所使用的相同语法在 WHERE 子句末尾添加其他条件;例如 WHERE [ClassLevel]="100" AND [CreditHours]>2。 指定完条件后,按 Enter。
-
键入“UNION”,然后按 Enter。
-
键入“SELECT”,后跟要包含在查询中的第二个表中的字段列表。 从此表中包含的字段应与从第一个表中包含的字段相同,顺序也应相同。 应使用方括号将字段名括起来,并用逗号分隔。 键入完字段名后,按 Enter。
-
键入“FROM”,后跟要包含在查询中的第二个表的名称。 按 Enter。
-
如果需要,按本过程步骤 6 中所述添加 WHERE 子句。
-
键入分号 (;) 以指示查询结束。
-
在“设计”选项卡上的“结果”组中,单击“运行”。
结果会显示在数据表视图中。