Использование таблицы дважды в одном запросе
Можно использовать одну таблицу два (и более) раз в одном запросе. Есть несколько ситуаций, в которых это может понадобиться.
Создание самосоединения с рефлексивной связью Можно связать таблицу с самой собой с помощью рефлексивной связи — связи, в которой столбцы с исходной ссылкой внешнего ключа и столбцы, на которые выполняется ссылка первичного ключа, находятся в одной таблице. Например, предположим, что в таблице сотрудников имеется дополнительный столбец 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.Дополнительные сведения о псевдонимах см. в разделе Практическое руководство. Создание псевдонимов таблиц.
См. также
Основные понятия
Работа с данными в области результатов