Как вы указали, решение состоит в том, чтобы объединить таблицу emp с самой собой.
CREATE FUNCTION fn_get_manager(p_empno IN NUMBER)
RETURN VARCHAR2
IS manager VARCHAR2;
BEGIN
SELECT mgr.name
INTO manager
FROM emp e, emp mgr
WHERE e.mgr = mgr.empno
AND e.empno = p_empno;
RETURN(manager);
END;
Этот запрос можно заключить в пользовательскую функцию, в которой переменная @employee
становится параметром.
Чтобы вернуть список сотрудников, вы можете вызвать функцию в операторе выбора.
SELECT e.empno, e.name, fn_get_manager(e.empno)
FROM emp e
Хотя эта конструкция работает, это ужасный способ сделать это для такого простого запроса.Функция будет выполняться для каждой записи в таблице emp, и результат будет очень медленным по сравнению с простым оператором соединения.
SELECT e.empno, e.name, mgr.name
FROM emp e,emp mgr
WHERE e.mgr = mgr.empno (+)
Я использовал здесь левое соединение, чтобы также обработать крайний случай "большой босс ", у которого нет самого менеджера.
edit: обновлен запрос на синтаксис оракула