联接表和查询

在 Access 查询中包含多个数据源时,可以使用联接来限制要查看的记录,具体取决于数据源如何相互关联。 你还可以使用联接合并两个数据源中的记录,以便来自源的每对记录都成为查询结果中的一条记录。

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

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

本文内容

概述

数据库是具有相互之间的逻辑关系的数据表的集合。 你可以使用关系通过它们所具有的公共字段连接表。 一个表可以是任意数量的关系的一部分,但每个关系始终只有两个表。 在查询中,关系由联接表示。

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

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

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

联接是指查询哪些关系对表:两个源中的数据可以如何基于它们所具有的相同数据值组合。 下面是查询设计视图中的联接的插图,在对话框中打开了联接的属性:

“联接属性”对话框。

表之间的这一行表示联接。 双击联接以打开 " 联接属性" 对话框(已描绘),然后查看或更改联接。

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

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

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

返回页首

联接类型

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

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

内部联接是指当相关表中存在相应数据时,Access 仅包含来自该表的数据,反之亦然。 大多数情况下,你将使用内部联接。 创建联接时,如果不指定联接类型,Access 会假定你需要内部联接。 内部联接非常有用,因为它们允许你基于共享值合并两个源中的数据-因此,在有完整的图片时,你只能看到数据。

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

外部联接类似于内部联接,但会从其中一个表中添加剩余行。 外部联接的方向:左外部联接包括左表中的所有记录-联接中的第一个表和一个右外部联接,其中包含右表中的所有记录-联接中的第二个表。

完全外部联接:所有数据,结合了可行

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

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

大多数情况下,交叉联接是将两个表添加到查询,然后忘记加入它们的副作用。 Access 会对此进行解释,这意味着你希望查看一个表中每条记录与另一个表中的每条记录(每个可能的记录组合)相结合。 由于不能合并数据,这种类型的联接很少会产生有用的结果。 但是,在某些情况下,只需使用交叉联接即可。

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

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

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

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

内联是最常见的联接类型。 它们通过联接字段中的数据,告诉查询其中一个联接表中的行对应于另一个表中的行。 当运行带有内部联接的查询时,查询操作中将仅包含两个联接表中存在公用值的行。

如何使用内部联接?

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

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

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

内部联接的 SQL 语法

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

FROM table1 INNER JOIN table2 ON table1.field1 比较 table2field2

INNER JOIN 操作包含以下部分:

部分

说明

table1, table2

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

field1, field2

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

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

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

返回页首

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

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

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

注意: 通过双击联接,然后在 "联接属性" 对话框中查看,可以很容易地判断出哪个表是左表或右表在给定联接中。 您也可以切换到 SQL 视图,然后检查 FROM 子句。

由于外部联接的一侧的某些行在另一个表中没有对应的行,因此当行不对应时,从其他表的查询结果中返回的某些字段将为空。

如何使用外部联接?

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

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

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

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

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

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

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

二义性外部联接

如果创建包含左联接和内部联接的查询,Access 可能无法确定首先执行哪个联接操作。 由于结果不同,具体取决于是否首先执行左联接或内部联接,Access 会显示错误消息:

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

外部联接的 SQL 语法

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

table1 [左 |RIGHT] table2
在 table1 上联接 table2比较 table2

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 关键字。

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

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

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

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

无意形成的叉积

1. 记下大量记录。

更正后的查询结果

1. 请注意,记录数很少。

返回页首

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

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

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

如何使用不等联接?

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

删除联接

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

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

  2. DELETE

-或者-

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

返回页首

注意:  本页面是自动翻译的,可能包含语法错误或不准确之处。 我们的目的是使此内容能对你有所帮助。 能否告知我们此信息是否有所帮助? 下面是该参考内容的英文版

另请参阅

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

联合查询合并多个选择查询的结果通过联合查询

创建基于多个表的查询

、编辑或删除关系

需要更多帮助?

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

此信息是否有帮助?

谢谢您的反馈!

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

×