Applies ToMicrosoft 365 专属 Access Access 2024 Access 2021 Access 2019 Access 2016

在 Access 查询中包含多个数据源时,根据数据源彼此之间的关系,使用联接来限制要查看的记录。 还可以使用联接合并来自两个数据源的记录,以便源中的每对记录成为查询结果中的一条记录。

本文讨论各种类型的联接,并演示如何在查询中使用它们。 默认情况下,如果在查询中使用的两个数据源之间已有关系,则会自动创建联接。 如果存在明确相互对应的字段,则还会创建联接。 可以删除自动创建的联接。 本文提供有关表关系的基本信息,包括如何创建表关系。

注意: 可以采用联接表的相同方式联接查询,也可以联接两者。

本文内容

概述

数据库是相互承担逻辑关系的数据表的集合。 使用关系按表共有的字段连接表。 表可以是任意数量的关系的一部分,但每个关系始终只包含两个表。 在查询中,关系由联接表示。

将表添加到查询时, Access 会创建基于表之间已定义的关系的联接。 可以在查询中手动创建联接,即使它们不表示已定义的关系。 如果使用其他查询 (而不是或除了表) 作为查询的数据源之外,还可以在源查询之间以及这些查询与用作数据源的任何表之间创建联接。

联接的行为与查询条件类似,因为它们建立了数据必须匹配的规则才能包含在查询操作中。 与条件不同,联接还指定满足联接条件的每一对行将合并到记录集中以形成单个行。

联接有四种基本类型:内部联接、外部联接、交叉联接和不等联接。 本文将探讨可使用的每种联接类型、使用每种类型的原因以及如何创建联接。

联接用于查询表的关系:指示如何根据两个源中共有的数据值组合两个源中的数据。 下面是查询设计视图中的联接的插图,该联接的属性在对话框中打开:

“联接属性”对话框。

表之间的此行表示联接。 双击某个联接,打开 () 描述的“联接属性”对话框,然后查看或更改联接。

联接有时是方向性的。 对话框的此区域显示联接中的哪个表,以及用于联接表的字段。

此区域确定联接的类型:选项 1 是内部联接,2 是左外部联接,3 是右外部联接。

可以使用这两个表中的字段,并且每个表中都显示与给定任务相关的数据。 在内部联接中,不包含其他数据。 在外部联接中,来自一个表的不相关的记录也包含在查询结果中。

返回页首

联接类型

联接有四种基本类型:内部联接、外部联接、交叉联接和不等联接。 交叉联接和不相等联接是高级联接类型,很少使用,但你应该了解它们,以便全面了解联接的工作原理。

内部联接:仅合并了两个表中的相关数据

内部联接是一个内部联接,其中 Access 仅包含来自表的数据(如果相关表中存在相应的数据),反之亦然。 大多数情况下,将使用内部联接。 创建联接但未指定联接类型时,Access 假定你需要一个内部联接。 内部联接很有用,因为它们使你能够基于共享值合并来自两个源的数据,因此仅在有完整画面时才能看到数据。

外部联接:已正确合并所有相关数据,以及来自一个表的所有剩余记录

外部联接类似于内部联接,但添加其中一个表中的剩余行。 外部联接是方向的:左外部联接包括左表(联接中的第一个表)中的所有记录,而右外部联接包括右表(联接中的第二个表)中的所有记录。

完整外部联接:所有数据,在可行的情况下合并

在某些系统中,外部联接可以包含这两个表中的所有行,行在对应时合并。 这称为完全外部联接,Access 不显式支持它们。 但是,可以使用交叉联接和条件来实现相同的效果。

交叉联接:所有数据,以各种可能的方式组合在一起

大多数情况下,交叉联接是向查询添加两个表,然后忘记联接它们的副作用。 Access 将这一点解释为,你希望查看一个表中的每条记录与另一个表中的每条记录(每个可能的记录组合)。 由于无法组合任何数据,因此这种联接很少产生有用的结果。 但在某些情况下,交叉联接正是你需要的。

不相等的联接:类似于常规联接,但使用不同的比较来合并行

不相等联接使用除等号 (=) 以外的运算符来比较值,并确定是否以及如何合并数据。 不显式支持不相等联接,但可以使用交叉联接和条件来实现相同的效果。

显示两个联接表中存在公共值的行

如果要仅显示联接字段中具有匹配值的行,请使用内部联接。 Access 会自动创建内部联接。

内联是最常见的联接类型。 它们根据联接字段中的数据告诉查询,其中一个联接表中的行对应于另一个表中的行。 运行具有内部联接的查询时,查询操作中仅包括两个联接表中存在共同值的行。

如何实现使用内部联接?

大多数情况下,无需执行任何操作即可使用内部联接。 如果添加到查询的表已有关系,则当您添加表时,Access 会自动在每对相关表之间创建一个内部联接。 如果实施了 引用完整性,Access 还会在联接行上方显示“1”以指示哪个表在 一对多关系 的“一”端,显示无穷符号 () 以指示哪个表在“多”端。

即使尚未创建关系,如果向查询添加两个表,并且每个表都有一个数据类型相同或兼容的字段,并且其中一个联接字段是 主键 ,Access 也会自动创建内部联接。 在这种情况下,不会显示“一”和“多”符号,因为未强制实施引用完整性。

如果将查询添加到查询,并且尚未在这些查询之间创建关系,Access 不会在这些查询之间或查询和表之间自动创建内部联接。 通常,应自行创建它们。 通过将字段从一个数据源拖动到另一个数据源上的字段来创建内部联接。 Access 将在两个字段之间显示一条线,表明已创建了联接。

内部联接的 SQL 语法

在 FROM 子句的 SQL 中指定内部联接,如下所示:

FROM table1 INNER JOIN table2 ON table1.field1 比较表 2field2

INNER JOIN 操作包含以下部分:

部分

说明

table1, table2

对其中的记录进行组合的表的名称。

field1, field2

要联接的字段的名称。 如果它们不是数值,则字段必须属于相同的数据类型,并且包含相同种类的数据,但它们不必有相同的名称。

比较

任何关系比较运算符:“=”、“<”、“>”、“<=”、“>=”或“<>”。

有关内部联接语法的详细信息,请参阅主题 INNER JOIN 操作

返回页首

显示一个表中的所有行,以及另一个表中的相应行

外部联接告诉查询,尽管联接两侧的某些行完全对应,但查询应包括一个表中的所有行,以及另一个表中在联接两侧共享一个共同值的行。

外部联接可以是左外部联接,也可以是右外部联接。 在左侧外部联接中,查询包括 SQL 语句 FROM 子句中第一个表中的所有行,并且仅包含联接字段包含这两个表共有值的其他表中的行。 在右外部联接中,查询包括 SQL 语句 FROM 子句中第二个表中的所有行,并且仅包含联接字段包含这两个表共有值的其他表中的行。

注意: 通过双击该联接,然后在“ 联接属性 ”对话框中查看,可以轻松判断哪个表是给定联接中的左表还是右表。 还可以切换到 SQL 视图,然后检查 FROM 子句。

由于外部联接一侧的某些行不会具有来自另一个表的相应行,因此当行不对应时,该表的查询结果中返回的某些字段将为空。

如何实现使用外部联接?

通过修改现有内部联接来创建外部联接。 如果不存在内部联接,请创建一个,然后将其更改为外部联接。

将内部联接更改为外部联接

  1. 在查询设计视图中,双击要更改的联接。

    将显示“联接属性”对话框。

  2. 在“ 联接属性 ”对话框中,记下选项 2 和选项 3 旁边列出的选项。

  3. 单击要使用的选项,然后单击“确定”。

  4. Access 显示联接,并显示一个箭头,该箭头指向数据源,其中所有行将包括到数据源,其中仅包含满足联接条件的行。

不明确的外部联接

如果创建包含 LEFT JOIN 和 INNER JOIN 的查询,Access 可能无法确定要首先执行的联接操作。 由于结果因先执行左联接还是先执行内部联接而异,Access 会显示一条错误消息:

若要更正此错误,必须修改查询,以便明确首先执行哪个联接。

外部联接的 SQL 语法

外部联接在 SQL 中的 FROM 子句中指定,如下所示:

FROM table1 [ LEFT |RIGHT ] JOIN table2ON table1.field1 compare table2.field2

LEFT JOIN 和 RIGHT JOIN 操作包含以下部分:

部分

说明

table1, table2

对其中的记录进行组合的表的名称。

field1, field2

要联接的字段的名称。 这些字段必须属于相同的数据类型,并且包含相同种类的数据,但它们不需要有相同的名称

比较

任何关系比较运算符:“=”、“<”、“>”、“<=”、“>=”或“<>”。

有关外部联接语法的详细信息,请参阅主题 LEFT JOIN,RIGHT JOIN 操作

返回页首

显示这两个表中的所有行,并在存在公共值的位置联接它们

如果要显示来自两个表的所有行并根据通用值联接它们,请使用完整的外部联接。 Access 不显式支持完全外部联接,但可以使用联合查询实现相同的效果。 以下过程说明如何执行此操作,但如果需要有关联合查询的详细信息,请参阅 另请参阅 部分。

若要使用联合查询执行完整的外部联接,请执行以下操作:

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

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

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

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

  5. 键入“UNION”,然后按 Enter。

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

  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. 在“设计”选项卡上的“结果”组中,单击“运行”。

交叉联接

交叉联接不同于内部和外部联接,因为它们未在 Access 中显式表示。 在交叉联接中,一个表中的每一行与另一个表中的每一行组合在一起,从而产生所谓的交叉积或笛卡尔积。 每当运行包含未显式联接的表的查询时,结果就是交叉积。 交叉联接通常是无意的,但在某些情况下,它们可能很有用。

为什么使用交叉联接?

如果要检查两个表或查询之间的每一个可能的行组合,请使用交叉联接。 例如,假设你的企业经历了一个辉煌的一年,你正在考虑向客户提供回扣。 可以生成一个查询来对每个客户的购买进行求和,创建一个具有多个可能的回扣百分比的小表,并将这两者合并到另一个执行交叉联接的查询中。 你最终会获得一个查询,该查询显示每个客户的一组假设回扣。

如何实现使用交叉联接?

每当在查询中包含表或查询,并且不为每个表或查询创建至少一个显式联接时,都会生成交叉联接。 Access 将每个表或查询中的每一行合并,这些行未显式联接到任何其他表或查询到结果中其他每一行。 请考虑上一段中的回扣方案。 假设你有 91 个客户,并且你希望查看 5 个可能的回扣百分比。 交叉联接 (91 和 5) 的乘积生成 455 行。

正如你想象的那样,无意的交叉联接可能会在查询结果中创建大量行。 此外,这些结果通常毫无意义,因为如果你实际上不打算将每一行与其他每一行合并,则结果中显示的大多数合并行将毫无意义。 最后,使用意外交叉联接的查询可能需要很长时间才能运行。

查询设计视图中的无意形成的交叉联接

1. 带圆圈的字段应相互联接。

无意形成的叉积

1. 请注意大量记录。

更正后的查询结果

1.请注意,记录数要小得多。

返回页首

基于字段值不相等的联接表

联接不必基于联接字段的 等效性 。 联接可以基于任何比较运算符,例如大于 (>) 、小于 (<) 或不等于 (<>) 。 不基于等效的联接称为不相等联接。

如果要基于不相等的字段值合并两个数据源的行,请使用不相等联接。 通常,不相等联接基于大于 (>) 、小于 (<) 、大于或等于 (>=) 或小于或等于 (<=) 比较运算符。 基于 的不相等联接不等于 (<>) 运算符可以返回几乎与交叉联接相同的行数,并且结果可能难以解释。

如何实现使用不相等的联接?

设计视图中不支持不相等的联接。 如果要使用它们,则必须使用 SQL 视图。 但是,可以在设计视图中创建联接,切换到 SQL 视图,找到等于 (=) 比较运算符,并将其更改为要使用的运算符。 执行此操作后,如果首先在 SQL 视图中将比较运算符改回等于 (=) ,则只能在设计视图中再次打开查询。

删除联接

如果 Access 自动创建你不需要的联接,或者如果错误地创建了联接(例如,具有不同数据类型的两个字段之间的联接),则可以删除该联接。

  1. 在查询设计网格中,单击要删除的联接。

  2. DELETE

-或者-

  • 在查询设计网格中,右键单击要删除的联接,然后单击“ 删除”。

返回页首

使用追加查询将记录添加到表

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

基于多个表创建查询

创建、编辑或删除关系

需要更多帮助?

需要更多选项?

了解订阅权益、浏览培训课程、了解如何保护设备等。

社区可帮助你提出和回答问题、提供反馈,并听取经验丰富专家的意见。