Вы знакомы с таблицей SCOTT.EMP
? Он находится в «стандартной» SCOTT
схеме (которая, к сожалению, больше не входит в комплект поставки каждой копии базы данных Oracle, начиная с версии 12.1 или около того). Проверьте свою базу данных: вы можете найти ее там. Или спросите об этом вашего администратора.
В любом случае: в таблице показаны 14 сотрудников малого бизнеса, и она включает в себя идентификатор сотрудника, а также идентификатор сотрудника его или ее менеджера. Итак, предположим, что вы начинаете с определенного сотрудника и хотите найти его или ее босса высшего уровня. (Аналогично вашей тестовой задаче.) В этой конкретной иерархии «предок» высшего уровня уникален, но это не имеет значения; рекурсивный запрос работал бы одинаково, если бы в каждом отделе был «начальник отдела» и не было руководителя над руководителями отдела.
При таком расположении легко определить «босса всех боссов» - у него нет босса. В его строке идентификатор менеджера равен null
. Это очень распространенное расположение для «корня» (или «корней») древовидных иерархий.
Вот как вы можете найти начальника, начиная с определенного идентификатора сотрудника и используя рекурсивный запрос - я понимаю, что именно вы хотите практиковаться. (То есть: если я правильно понимаю, вы не заинтересованы в решении проблемы «любыми средствами»; скорее, вы хотите увидеть, как работают рекурсивные запросы, в небольшом примере, чтобы вы могли понять ВСЕ, что происходит.)
with
r ( empno, mgr ) as (
select empno, mgr -- ANCHOR leg of recursive query
from scott.emp
where empno = 7499
union all
select e.empno, e.mgr -- RECURSIVE leg of recursive query
from scott.emp e inner join r on e.empno = r.mgr
)
select empno
from r
where mgr is null
;
Я не буду пытаться угадать, где у вас могут возникнуть трудности с пониманием этого примера. Вместо этого я буду ждать, пока вы спросите.