Соединение таблицы с самой собой

Отношения могут существовать не только между таблицами, но и внутри одной таблицы (рекурсивная связь). Например (Рисунок 3), таблица EMP содержит список сотрудников, каждый из которых может быть начальником другого сотрудника и может, в свою очередь, сам быть начальником. Если Вы хотите получить список сотрудников с указанием начальника, обычный многотабличный запрос не поможет, т.к. оба сравниваемых столбца находятся в одной таблице (EMPNO – первичный ключ для списка начальников, MGR – внешний ключ для списка сотрудников). Для выполнения такого запроса необходимо соединить таблицу саму с собой, это возможно путем имитации двух таблиц с помощью псевдонимов. Например, с помощью псевдонима m представляем таблицу EMP, как список начальников с первичным ключом на колонке EMPNO, а с помощью псевдонима e – как список сотрудников с внешним ключом на колонке MGR. Тогда мы можем составить обычный многотабличный запрос на основе эквисоединения этих двух таблиц.

Рисунок 3 Рекурсивная связь внутри таблицы

SQL> SELECT m.ename || ' is manager of ' || e.ename " "

2 FROM emp m, emp e

3 WHERE m.empno=e.mgr;

 

-----------------------------------

JONES is manager of SCOTT

JONES is manager of FORD

BLAKE is manager of ALLEN

BLAKE is manager of WARD

BLAKE is manager of JAMES

BLAKE is manager of TURNER

BLAKE is manager of MARTIN

CLARK is manager of MILLER

SCOTT is manager of ADAMS

KING is manager of JONES

KING is manager of CLARK

KING is manager of BLAKE

FORD is manager of SMITH

13 rows selected.