在 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 compare table2.field2

INNER JOIN 操作包含以下部分:

部分

说明

table1, table2

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

field1, field2

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

compare

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

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

返回页首

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

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

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

注意: 双击联接,然后在"联接属性"对话框中查找,可轻松判断给定联接中的左表或右表。 还可以切换到SQL视图,然后检查 FROM 子句。

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

如何使用 外部联接?

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

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

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

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

  2. 在" 联接属性 "对话框中,请注意选项 2 和选项 3旁边列出的选项。

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

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

不明确的外部联接

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

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

SQL的语法外部联接

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

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

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

部分

说明

table1, table2

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

field1, field2

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

compare

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

有关代码语法外部联接,请参阅"LEFT JOIN"主题,"RIGHT JOIN 操作"。

返回页首

显示两个表中的所有行,并联接共同值存在的行

当你想要显示两个表中的所有行并基于通用值联接它们时,请使用完整的外部联接。 Access 不显式支持完全外部联接,但可以使用联合查询实现相同的效果。 以下过程介绍了如何执行此操作,但如果需要有关联合查询详细信息,请参阅"另 请参阅" 部分。

若要使用联合查询执行完整外部联接:

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

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

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

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

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

    注意: 使用联合查询执行完整查询时,请勿使用 ALL 外部联接。

  6. 按 Ctrl+V 粘贴SQL 3 中复制的代码。

  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 个客户,并且想要查看五个可能的返利百分比。 交叉联接生成 455 行 (91 和 5 行) 。

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

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

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

无意形成的叉积

1. 请注意大量的记录。

更正后的查询结果

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

返回页首

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

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

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

如何使用不相等联接?

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

删除联接

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

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

  2. DELETE。

- 或 -

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

返回页首

使用追加查询

或删除关系

Need more help?

Expand your skills
Explore Training
Get new features first
Join Microsoft Office Insiders

Was this information helpful?

How satisfied are you with the translation quality?
What affected your experience?

Thank you for your feedback!

×