适用于: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
手动创建自联接
在 关系图窗格 中添加您要使用的表或表值对象。
再次添加同一个表,以便“关系图”窗格在“关系图”窗格中显示同一个表或表值对象两次。
查询和视图设计器通过将一个序列号添加到表名来为第二个实例分配别名。 此外,查询和视图设计器在关系图窗格中对表或表值对象的两个实例之间创建联接线。
右键单击联接行,然后从快捷菜单中选择 属性。
在“属性”窗口中,单击 联接条件和类型,然后单击属性右侧的 省略号(...)。
在“联接”对话框中,根据需要更改主键之间的比较运算符。 例如,可以将运算符更改为小于(<)。
在表或表值对象的首次出现中拖动主联接列的名称,并将其放到第二次出现中的相应列上,创建额外的联接条件(例如,authors.zip = authors1.zip)。
指定查询的其他选项,例如输出列、搜索条件和排序顺序。
另请参阅
自动创建 Self-Joins(Visual Database Tools)
使用联接 查询 (Visual Database Tools)