2010-09-14 3 views
3

Got таблицу в SQL Server 2005, который используется для поддержания истории сливающихся операций:Найти последнюю запись в одной таблице цепи (SQL Server)

  • Колонка FROM_ID (INT)
  • Column 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.

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

Спасибо!

Матье

ответ

4

Использование 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   
+0

Протестировано, и почти там, кроме того, что MAX (ToID) не будет работать, потому что идентификатор назначения, с которым нужно объединиться, не обязательно больше, чем предыдущий идентификатор назначения в той же цепочке ... Итак, ID 1 может объединиться до 3, а затем 3 может слить до 2, например – tjeuten

+0

. Могло исправить это, добавив метку времени к информации о слиянии и выбрав метод «сверху 1 порядок по дате». Но было интересно, можно ли это сделать без timestamping – tjeuten

3

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

;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 
+0

Да, сэр спасибо, что заставляет его работать! Спасибо вам обоим ! – tjeuten

+0

Спасибо Мартину. –

Смежные вопросы