Как получить наименьший общий родитель для 2 строк в рекурсивной таблице (SQL) - PullRequest
3 голосов
/ 03 марта 2009

Допустим, у нас есть таблица с классическим рекурсивным отношением 'идентификатор менеджера':

Пользователи user_id int manager_id int (относится к user_id)

Если вы случайно выберете 2 строки в таблице - или 2 узла - как найти самый низкий уровень, общего предка? Моя платформа - SQL Server 2005 (Transact-SQL), но любой SQL, совместимый с ANSI, также будет работать ...

Ответы [ 2 ]

3 голосов
/ 04 марта 2009

Несколько мелких правок в ответе Кассного, и это работает:

WITH
    hier1 (id, parent) AS (
    SELECT      id, parent
    FROM        table
    WHERE       id = @user1
    UNION ALL
    SELECT      id, parent
    FROM        table l, hier1 h
    WHERE       l.id = h.parent
    ),
    hier2 (id, parent) AS (
    SELECT      id, parent
    FROM        table
    WHERE       id = @user2
    UNION ALL
    SELECT      id, parent
    FROM        table l, hier1 h
    WHERE       l.id = h.parent
    )
SELECT  TOP 1 hier1.id
FROM    hier1, hier2
WHERE   hier1.id = hier2.id
2 голосов
/ 03 марта 2009
WITH
    hier1 (id, parent) AS (
    SELECT  id, parent
    FROM    table l
    WHERE   id = @user1
    UNION ALL
    SELECT  id, parent
    FROM    table l, hier1 h
    WHERE   l.id = parent
    ),
    hier2 (id, parent) AS (
    SELECT  id, parent
    FROM    table l
    WHERE   id = @user2
    UNION ALL
    SELECT  id, parent
    FROM    table l, hier1 h
    WHERE   l.id = parent
    ),
SELECT  TOP 1 hier1.id
FROM    hier1, hier2
WHERE   hier1.id = hier2.id
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...