Поделиться через


Использование таблицы дважды в одном запросе

Можно использовать одну таблицу два (и более) раз в одном запросе. Есть несколько ситуаций, в которых это может понадобиться.

  • Создание самосоединения с рефлексивной связью    Можно связать таблицу с самой собой с помощью рефлексивной связи — связи, в которой столбцы с исходной ссылкой внешнего ключа и столбцы, на которые выполняется ссылка первичного ключа, находятся в одной таблице. Например, предположим, что в таблице сотрудников имеется дополнительный столбец employee.manager_emp_id, связанный внешним ключом со столбцом employee.emp_id. В каждой строке таблицы сотрудников столбец 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.Дополнительные сведения о псевдонимах см. в разделе Практическое руководство. Создание псевдонимов таблиц.

См. также

Основные понятия

Работа с данными в области результатов

Другие ресурсы

Установка условий поиска