如何手动创建自联接 (Visual Database Tools)
即使表在数据库中没有自反关系,您也可将它与自身联接。例如,可使用自联接查找生活在同一市县的作者对。
与任何联接一样,自联接至少需要两个表。不同之处在于,您不是向查询中添加第二个表,而是添加同一个表的第二个实例。这样,可将表的第一个实例中的列与第二个实例中的同一列相比较,以便对列中的值相互进行比较。查询和视图设计器会为表的第二个实例分配一个别名。
例如,若要创建自联接来查找居住在 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
手动创建自联接
将要使用的表或表值对象添加到“关系图”窗格中。
再次添加同一个表,以便“关系图”窗格中显示同一个表或表值对象两次。
查询和视图设计器将通过为表名添加一个顺序号来为第二个实例分配别名。此外,查询和视图设计器会在“关系图”窗格内表或表值对象的两个实例之间创建一条联接线。
右键单击联接线,再从快捷菜单中选择**“属性”**。
在“属性”窗口中,单击**“联接条件和类型”,再单击该属性右侧的“省略号(…)”**。
在“联接”对话框中,根据需要更改两个主键间的比较运算符。例如,可将运算符更改为小于 (<)。
通过拖动表或表值对象的第一个实例中的主联接列的名称,并将其放置到第二个实例的相应列上,即可创建附加联接条件(例如,authors.zip = authors1.zip)。
为查询指定其他选项,如输出列、搜索条件和排序顺序等。