在一个查询中使用某个表两次
可以在单个查询内使用同一个表两次(或更多次)。在如下几种情况下可这样做。
使用自反关系创建自联接 可以使用自反关系(在该关系中,引用外键列和被引用主键列位于同一个表内)将表与其自身联接。例如,假设 employee 表包含一个附加列 employee.manager_emp_id,且存在从 manager_emp_id 到 employee.emp_id 的外键。在 employee 表的每一行内,manager_emp_id 列指示雇员的老板。更确切地说,它显示职员的老板的 emp_id。
通过使用自反关系将表与其自身联接,可以建立这样的结果集:每行都包含老板的姓名以及该老板的一个职员的姓名。得到的 SQL 可能像下面这样:
SELECT boss.lname, boss.fname, employee.lname, employee.fname FROM employee INNER JOIN employee boss ON employee.manager_emp_id = boss.emp_id
有关使用自反关系创建联接的更多信息,请参见 如何:自动创建自联接。
在不使用自反关系的情况下创建自联接 可以在不使用自反关系的情况下将表与其自身联接。例如,可以建立这样的结果集:每行描述一个职员以及该职员的潜在领导。(潜在领导是指具有更高职位等级的职员。)得到的 SQL 可能像下面这样:
SELECT employee.fname, employee.lname, mentor.fname, mentor.lname FROM employee INNER JOIN employee mentor ON employee.job_lvl < mentor.job_lvl
注意该联接使用了相等以外的条件。有关使用相等以外的条件联接表的更多信息,请参见联接比较运算符。
有关使用不相关的列创建自联接的更多信息,请参见 如何:手动创建自联接。
在没有自联接的情况下使用一个表两次 即使没有自联接,也可以在一个查询内使用同一个表两次(或更多次)。例如,可以建立这样的结果集:包含作者的其他书或您喜欢的书的作者。这种情况下,将使用 titleauthors 表两次,一次用于查找喜欢的书 (Is Anger the Enemy?) 的作者,一次用于查找那些作者的其他书。得到的 SQL 可能像下面这样:
SELECT other_title.title FROM titles favorite_title INNER JOIN titleauthor favorite_titleauthor ON favorite_title.title_id = favorite_titleauthor.title_id INNER JOIN authors ON favorite_titleauthor.au_id = authors.au_id INNER JOIN titleauthor other_titleauthor ON authors.au_id = other_titleauthor.au_id INNER JOIN titles other_title ON other_titleauthor.title_id = other_title.title_id WHERE favorite_title.title = 'Is Anger the Enemy?' AND favorite_title.title <> other_title.title
说明 为区分任意一个表的多次使用,上述查询使用了下列别名:favorite_title、favorite_titleauthor、other_titleauthor 和 other_title。有关别名的更多信息,请参见 如何:创建表别名。