在查询中联接数据源

重要:  本文是由机器翻译的,请参阅免责声明。请在 此处 中查找本文的英文版本以便参考。

当您在查询中包括多个数据源时,可使用联接以根据数据源彼此相关的方式限制要查看的记录。您还可以使用联接来合并两个数据源中的记录,以便来自这些数据源的每对记录在查询结果中变为一个记录。

本文讨论各种类型的联接并演示如何在查询中使用联接。

注意: 在本文中,整个术语表用于表示数据源。您也可以使用查询中联接表一样。

概述

内部联接: 显示行在两个联接表中存在公用值

向左或右外部联接: 显示一个表中的所有行和另一个表中的对应行

完全外部联接: 显示两个表中的所有行,并在存在公用值时合并行

交叉联接: 行的所有可能合并

不等联接: 根据字段值的不等运算符的记录组合在一起

删除联接

概述

联接针对的是查询,而关系针对的是表:指明如何根据两个数据源共同具有的数据值合并两个数据源中的数据。下图显示了查询“设计”视图中的联接,对话框中打开了联接的属性:

“联接属性”对话框。

此表之间的连线表示联接。双击以打开联接联接属性对话框 (图) 和审阅或更改联接。

联接有时是定向的。该对话框的此区域显示哪个表是联接中的表,哪些字段用于联接表。

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

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

某些联接是自动创建的

在许多情况下,您不必考虑联接,如果您添加到查询的表已具有关系,Access 将创建一个内部联接以反映该关系。在大多数情况下,这是您所需的:一种确保正确地合并从两个表中提取的数据的方式,以便包括每个表中的正确数据,而不包括任何其他内容。但在某些情况下,您希望联接包含更多内容。

联接类型

有四种基本联接类型:内部联接、外部联接、交叉联接和不等联接。交叉联接和不等联接是高级联接类型并且很少使用,但是您应该了解这些类型,以便全面了解联接的工作方式。

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

内部联接是这样一种联接:仅当一个表中的数据在相关表中存在对应数据时,Access 才会包括该表中的数据。在大多数情况下,您将使用内部联接。如果您创建联接但未指定联接类型,Access 将假定您需要内部联接。内部联接非常有用,因为使用内部联接可以根据共享值合并两个数据源中的数据,因此您仅在具有完整数据时查看数据。

外部联接:正确合并所有相关数据,再加上一个表中的所有其余记录

外部联接与内部联接相似,但是增加了其中一个表的其余行。外部联接是定向的:左外部联接包括左表(联接中的第一个表)中的所有记录,右外部联接包括右表(联接中的第二个表)中的所有记录。

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

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

交叉联接:以每种可能的方式合并所有数据

在大多数情况下,交叉联接是将两个表添加到查询中而忘记联接两个表时产生的意外情况。Access 解释这是为了说明您希望看到一个表中的每条记录与另一个表中的每条记录合并(所有可能的记录合并)。由于无法合并任何数据,这种类型的联接很少产生有用的结果。但是在某些情况下,交叉联接正是您所需要的。

不等联接:与常规联接相似,但是使用不同的比较方式来合并行

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

返回页首

内部联接:显示在两个联接表中存在公用值的行

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

内部联接是最常见的联接类型。它们根据联接字段中的公用值告诉查询:其中一个联接表中的行与另一个表中的行对应。当运行带有内部联接的查询时,查询操作中将只包括这两个联接表中存在公用值的行。

如何使用内部联接?

若要创建内部联接,请在查询设计网格中将一个数据源中的字段拖动到另一个数据源中的字段。Access 通过这些字段联接两个表,并在它们之间显示一条线。

自动内部联接

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

即使尚未创建关系,如果向查询添加两个表,每个表有一个具有相同名称和相同或兼容数据类型的字段(如果其中一个字段是其所在表的主键),Access 也将自动创建内部联接。在此情况下,由于不实施参照完整性,因此不显示“一”和“多”符号。

如果向查询添加查询,而尚未创建这些查询之间的关系,Access 不会在这些查询之间或在查询与表之间自动创建内部联接。通常,您应当自行创建内部联接(方法是将一个数据源中的字段拖动到另一个数据源中的字段上)。如果不创建内部联接,可能会生成交叉联接,如果这并不是您所需要的,则会是令人困惑的结果。

内部联接的 SQL 语法

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

FROM table1 INNER JOIN table2 ON table1.field1compopr table2.field2

INNER JOIN 操作包含以下部分:

部分

说明

table1, table2

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

field1, field2

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

compopr

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

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

返回页首

左或右外部联接:显示一个表中的所有行和另一个表中的对应行

外部联接告诉查询:即使联接双方的某些行完全对应,查询应当包括其中一个表中的所有行,并包括另一个表中联接双方具有相同值的那些行(在两个表都包括某行时合并数据)。

外部联接可以为左外部联接,也可以为右外部联接。在左外部联接中,对于 SQL 语句 FROM 子句中的第一个表,查询包括所有行;对于另一个表,则只包括两个表的联接字段值彼此相同的行。在右外部联接中,对于 SQL 语句 FROM 子句中的第二个表,查询包括所有行;对于另一个表,则只包括两个表的联接字段值彼此相同的行。

注意: 您可以轻松地了解哪个表是左的表或右在给定联接表通过双击联接,然后查看联接属性对话框。或者,您可以在 SQL 视图中,检查 FROM 子句联接的详细信息。

由于外部联接一方中的某些行可能在另一个表中没有对应行,在行不对应时,从另一个表得到的查询结果中返回的某些字段将为空。

如何使用外部联接?

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

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

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

    联接属性对话框中显示。

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

  3. 单击以使用,然后单击所需的选项确定

  4. Access 显示联接,并显示一个箭头,该箭头从查询将包括所有行的数据源指向查询将只包括满足联接条件的行的数据源。

二义性的外部联接

如果您创建一个包含 LEFT JOIN 和 INNER JOIN 的查询,Access 可能无法确定先执行哪个联接操作。由于结果会因先执行左联接还是内部联接而有所不同,因此 Access 将显示一则有关二义性外部联接的错误消息。

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

外部链接和查询可更新性

在 Access 应用程序中,仅当满足下列条件时,才可以更新多表查询中的某个字段:

  • 该字段来自查询的“多数”表(在另一个表中查找数据的表)。

  • 查询输出包括“多数”表中的主键。

  • 如果“多数”表是外部联接的一部分,则它在联接的内侧:左外部联接的左表或右外部联接的右表。

如果未满足任一条件,则该字段无论在查询数据表中还是在基于该查询的视图中都将为只读字段。

外部联接的 SQL 语法

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

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

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

部分

说明

table1, table2

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

field1, field2

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

compopr

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

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

返回页首

完全外部联接:显示两个表中的所有行,并在存在公用值时合并行

如果要显示两个表中的所有行并根据公用值联接行,请使用完全外部联接。Access 并未显式支持完全外部联接,但是您可以通过使用交叉联接和条件获得相同的效果。

  1. 创建查询并添加两个表。如果 Access 创建了任何联接,请将其删除。

  2. 为查询输出添加所需的任何字段。

  3. 从两个表中添加联接字段,然后清除这些字段的“显示”行中的复选框。

  4. 在查询设计网格中的第一个表的联接字段下,在“条件”行中输入第二个表的联接字段。如果联接字段具有相同的字段名称,请确保在引用这些字段时包括表名称。

  5. 行中,在刚输入的条件下键入Is Null

  6. 在下一个“”行中(就在第一个“或”行下),在第二个表的联接字段下键入 Is Null

查询将返回:

  • 联接字段值匹配的合并行集,据此合并的数据(实际上是内部联接)

  • 第一个表中的联接字段没有值的合并行集(实际上是左外部联接的外侧)

  • 第二个表中的联接字段没有值的合并行集(实际上是右外部联接的外侧)

返回页首

交叉联接:行的所有可能合并

每当您在查询中包括表但未联接表时,都会产生交叉联接。Access 将一个表中的每行与另一个表中的每行合并,导致生成叉积或卡迪尔积。这通常不是您所期望的,但是交叉联接可以用于了解假设的情况。

为什么使用交叉联接?

如果要检查两个表或查询之间的所有可能的行合并,请使用交叉联接。假设贵公司今年收益不错,您考虑要给予客户一些折扣。您可以生成一个查询,对每个客户的购买产品进行汇总;创建一个小表,其中包括若干可能折扣百分比,然后将二者组成执行交叉联接的另一个查询。叉积为每个客户显示一组假设折扣,这正是您所希望的。

如何使用交叉联接?

将两个表添加到查询中,不在两个表之间创建联接,并在查询输出中包括来自这两者的字段。Access 会将没有与任何其他表或查询显式联接的每个表或查询中的每一行与查询结果中其余的每一行进行合并。请考虑上一段中的折扣示例。假设您有 91 个客户,您想要查看五个可能的折扣百分比。交叉联接生成 455 行(91 与 5 的乘积)。

如果您添加的表相关,Access 将自动创建内部联接。您可以根据需要删除此自动联接以生成交叉联接。

正如您想像的那样,无意形成的交叉联接会在查询结果中创建大量的行。而且,这些结果通常没有意义,因为行不是基于共享数据进行合并,并且合并不与任何内容对应。

返回页首

不等联接:根据字段值的不等来合并记录

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

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

如何使用不等联接?

Access 并未在设计视图中显式支持不等联接,但是您可以通过使用交叉联接和条件获得相同的效果:

  1. 创建查询并为不等联接创建两个表。如果 Access 自动创建了任何联接,请将其删除。

  2. 添加所需的输出字段。

  3. 从第一个表中添加联接字段,然后清除“显示”行中的复选框。

  4. 在“条件”行中,键入要使用的不等运算符,接着键入第二个表的联接字段。

查询将返回根据您指定的不等运算符从两个表中合并数据的行。

返回页首

删除联接

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

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

  2. 删除

-或-

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

 返回页首

注意: 机器翻译免责声明:本文是由无人工介入的计算机系统翻译的。Microsoft 提供机器翻译是为了帮助非英语国家/地区用户方便阅读有关 Microsoft 产品、服务和技术的内容。由于机器翻译的原因,本文可能包含词汇、语法或文法方面的错误。

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

此信息是否有帮助?

谢谢您的反馈!

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

×