在一个查询中使用某个表两次

可以在单个查询内使用同一个表两次(或更多次)。 在如下几种情况下可这样做。

  • 使用自反关系创建自联接   可以使用自反关系(在该关系中,引用外键列和被引用主键列位于同一个表内)将表与其自身联接。 例如,假设 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。有关别名的更多信息,请参见 如何:创建表别名

请参见

概念

处理“结果”窗格中的数据

其他资源

指定搜索条件