如何:手动创建自联接

即使表在数据库中没有自反关系,也可将它与自身联接。 例如,可使用自联接查找生活在同一城市的作者对。

与任何联接一样,自联接至少需要两个表。 不同之处在于,不是向查询中添加第二个表,而是添加同一个表的第二个实例。 这样,可将表的第一个实例中的列与第二个实例中的同一列相比较,这样可相互比较列中的值。 查询和视图设计器为表的第二个实例分配一个别名。

例如,如果要创建自联接来查找居住在 Berkeley 内的所有作者对,可将表的第一个实例中的 city 列与第二个实例中的 city 列相比较。 所得到的查询可能类似于:

   SELECT 
         authors.au_fname, 
         authors.au_lname, 
         authors1.au_fname AS Expr2, 
         authors1.au_lname AS Expr3
      FROM 
         authors 
            INNER JOIN
            authors authors1 
               ON authors.city 
                = authors1.city
      WHERE
         authors.city = 'Berkeley'

创建自联接通常需要多个联接条件。 若要了解其中的原因,请考虑上述查询的结果:

   Cheryl Carson       Cheryl Carson
   Abraham Bennet      Abraham Bennet
   Cheryl Carson       Abraham Bennet
   Abraham Bennet      Cheryl Carson

第一行没有用,它指出 Cheryl Carson 和 Cheryl Carson 生活在同一城市。 第二行也没有用。 若要消除这些无用数据,可添加另一个条件,仅保留其中的两个作者姓名是指不同作者的结果行。 得到的查询可能类似于:

   SELECT 
         authors.au_fname, 
         authors.au_lname, 
         authors1.au_fname AS Expr2, 
         authors1.au_lname AS Expr3
      FROM 
         authors 
            INNER JOIN
            authors authors1 
               ON authors.city 
                = authors1.city
               AND authors.au_id
                <> authors1.au_id
      WHERE
         authors.city = 'Berkeley'

结果集改进为:

   Cheryl Carson       Abraham Bennet
   Abraham Bennet      Cheryl Carson

但是这两个结果行是冗余的。 第一行说 Carson 与 Bennet 生活在同一城市,第二行说 Bennet 与 Carson 生活在同一城市。 若要消除此冗余行,可将第二个联接条件从“不等于”更改为“小于”。得到的查询可能类似于:

   SELECT 
         authors.au_fname, 
         authors.au_lname, 
         authors1.au_fname AS Expr2, 
         authors1.au_lname AS Expr3
      FROM 
         authors 
            INNER JOIN
            authors authors1 
               ON authors.city 
                = authors1.city
               AND authors.au_id
                < authors1.au_id
      WHERE
         authors.city = 'Berkeley'

结果集类似于:

   Cheryl Carson       Abraham Bennet

提示

显示的对话框和菜单命令可能会与“帮助”中的描述不同,具体取决于您现用的设置或版本。 若要更改设置,请在“工具”菜单上选择“导入和导出设置”。 有关更多信息,请参见 使用设置

手动创建自联接

  1. 将要使用的表或表值对象添加到“关系图”窗格中。

  2. 再次添加同一个表,以便“关系图”窗格在“关系图”窗格内显示同一个表或表值对象两次。

    查询和视图设计器通过为表名添加一个顺序号来为第二个实例分配别名。 此外,查询和视图设计器在“关系图”窗格内的表或表值对象的两个实例之间创建一条联接线。

  3. 右击联接线,然后从快捷菜单中选择**“属性”**。

  4. 在“属性”窗口中,单击“联接条件和类型”,再单击属性右侧的省略号 (…)

  5. 在“联接”对话框中,根据要求更改两个主键间的比较运算符。 例如,可将该运算符更改为小于号 (<)。

  6. 通过拖动表或表值对象的第一个实例中的主联接列的名称,并将其放置到第二个实例的相应列上,可以创建附加联接条件(例如,authors.zip = authors1.zip)。

  7. 为查询指定其他选项,如输出列、搜索条件和排序顺序。

请参见

任务

如何:自动创建自联接

其他资源

使用联接查询