手动创建 Self-Joins (Visual Database Tools)

适用于:SQL Server

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

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

例如,如果要创建自联接来查找 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  

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

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  

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

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. 指定查询的其他选项,例如输出列、搜索条件和排序顺序。

另请参阅

自动创建 Self-Joins(Visual Database Tools)
使用联接 查询 (Visual Database Tools)