手动创建自联接 (Visual Database Tools)

适用于:SQL Server

即使表在数据库中没有反射关系,也可以将表联接到自身。 例如,可以使用自联接来查找居住在同一城市的一对作者。

与任何联接一样,自联接至少需要两个表。 区别在于,添加同一表的第二个实例,而不是向查询添加第二个表。 这样,就可以将表的第一个实例中的列与第二个实例中的同一列进行比较,这样就可以将列中的值彼此进行比较。 查询和视图设计器工具(Visual Database Tools)为表的第二个实例分配别名。

例如,如果要创建自联接来查找伯克利中的所有作者配对,请将第一个实例中的city列与第二个实例中的city列进行对比。 生成的查询可能如下所示:

SELECT authors.au_fname,
       authors.au_lname,
       authors1.au_fname AS Expr2,
       authors1.au_lname AS Expr3
FROM authors
     INNER JOIN authors AS 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

第一行是无用的;它表明谢丽尔·卡森住在与谢丽尔·卡森同一个城市。 第二行同样无用。 若要消除此无用数据,请添加另一个条件,只保留两个作者名称描述不同作者的那些结果行。 生成的查询可能如下所示:

SELECT authors.au_fname,
       authors.au_lname,
       authors1.au_fname AS Expr2,
       authors1.au_lname AS Expr3
FROM authors
     INNER JOIN authors AS 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

但两个结果行是冗余的。 第一个说卡森住在贝内特所在的同一个城市,第二个说贝内特住在卡森所在的同一个城市。 若要消除此冗余,可以将第二个联接条件从“不等于”更改为“小于”。生成的查询可能如下所示:

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

结果集如下所示:

Cheryl Carson       Abraham Bennet

手动创建自联接

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

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

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

  3. 右键单击联接行,然后从快捷菜单中选择 属性

  4. 在“属性”窗口中,选择“联接条件”和“类型”,然后选择属性右侧的省略号(...)。

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

  6. 在表或表值对象的首次出现中拖动主联接列的名称,并将其放到第二次出现中的相应列上,创建额外的联接条件(例如,authors.zip = authors1.zip)。

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