Найти последнюю запись в цепочке из одной таблицы (SQL Server) - PullRequest
3 голосов
/ 14 сентября 2010

Получил эту таблицу в SQL Server 2005, которая используется для ведения истории операций слияния:

  • Столбец FROM_ID (int)
  • Столбец TO_ID (int)

Теперь мне нужен запрос, который принимает исходный идентификатор FROM_ID и возвращает последний доступный TO_ID.

Так, например:

  • ID 1 объединяется с ID 2
  • Позже, ID 2 объединяется с ID 3
  • Опять позже, ID 3 объединяется с ID 4

Таким образом, запрос, который я пытаюсь составить, примет в качестве входных данных (в предложении WHERE я предполагаю) ID 1 и должен дать мне последний доступный TO_ID, в данном случае 4.

Полагаю, мне нужна логика рекурсии, но я не знаю, с чего начать.

Спасибо!

Матье

Ответы [ 2 ]

4 голосов
/ 14 сентября 2010

Использование CTE будет работать.

Testscript

DECLARE @IDs TABLE (
  FromID INTEGER
  , ToID INTEGER
)

INSERT INTO @IDs
SELECT           1, 2 
UNION ALL SELECT 2, 3
UNION ALL SELECT 3, 4

Оператор SQL

;WITH q AS (
    SELECT  FromID, ToID
    FROM    @IDs
    UNION ALL 
    SELECT  q.FromID, u.ToID
    FROM    q
            INNER JOIN @IDs u ON u.FromID = q.ToID
)
SELECT  FromID, MAX(ToID)
FROM    q
WHERE   FromID = 1
GROUP BY
        FromID           
3 голосов
/ 14 сентября 2010

Если это работает для вас, дайте Ливену принятый ответ, так как он основан на его коде.

;WITH q AS (
    SELECT  1 AS LEVEL, FromID, ToID
    FROM    @IDs
    WHERE FromID=1
    UNION ALL 
    SELECT  LEVEL + 1, q.FromID, u.ToID
    FROM    q
            INNER JOIN @IDs u ON u.FromID = q.ToID
)

SELECT TOP 1 ToID
 FROM q
ORDER BY LEVEL DESC
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...