рекурсивный SQL-запрос, возвращающий определенных боссов верхнего уровня

Я новичок в sql, и мне нужна ваша помощь в этой ситуации, которая может быть базовой для большинства из вас:

У меня есть таблица «Сотрудник», в которой, среди прочего, есть атрибуты ID и BOSS_ID. BOSS_ID боссов верхнего уровня равен NULL.

Теперь я хотел бы иметь таблицу, в которой перечислены идентификаторы сотрудников вместе с идентификаторами конкретного босса высшего уровня.

Что я уже сделал, так это рекурсивный запрос, который возвращает всех сотрудников с идентификатором следующего босса более высокого уровня:

WITH TopBosses(ID,NAME, BOSS_ID)
AS
(
    SELECT ID,NAME, BOSS_ID
    FROM EMPLOYEE
    WHERE BOSS_ID IS NULL
    UNION ALL

    SELECT EMPLOYEE.ID,EMPLOYEE.NAME, EMPLOYEE.BOSS_ID
    FROM EMPLOYEE
    INNER JOIN TopBosses
        ON EMPLOYEE.BOSS_ID = TopBosses.ID
)
SELECT ID,NAME, BOSS_ID
FROM TopBosses

Но поскольку идентификатор босса следующего уровня уже является частью таблицы «Сотрудник», это довольно бесполезно для меня :) Я просто не понимаю последний шаг, как я всегда могу получить конкретного босса высшего уровня.

Спасибо за ваши ответы!


person user2910467    schedule 23.10.2013    source источник
comment
Какую базу данных вы используете?   -  person Przemyslaw Kruglej    schedule 23.10.2013
comment
Это база данных MySQL   -  person user2910467    schedule 23.10.2013


Ответы (1)


Вы можете включить идентификатор Top Boses в каждую строку

e.g.

WITH TopBosses(ID,NAME,BOSS_ID,TOP_ID)
AS
(
    SELECT ID,NAME,NULL AS BOSS_ID,ID AS TOP_ID
    FROM EMPLOYEE
    WHERE BOSS_ID IS NULL
    UNION ALL

    SELECT EMPLOYEE.ID,EMPLOYEE.NAME,EMPLOYEE.BOSS_ID,TopBosses.TOP_ID
    FROM EMPLOYEE
    INNER JOIN TopBosses
        ON EMPLOYEE.BOSS_ID = TopBosses.ID
)
SELECT ID,NAME,BOSS_ID,TOP_ID
FROM TopBosses
person Caleth    schedule 23.10.2013
comment
Итак, в вашем решении BOSS_ID — это босс следующего уровня, а TOP_ID — босс высшего уровня... отлично :) большое спасибо! - person user2910467; 23.10.2013