2010-09-14 40 views
3

得到了在SQL Server 2005中,這是用來維持合併操作的歷史記錄此表:查找單錶鏈(SQL Server)的最後一個記錄

  • 列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.

我想我需要一些遞歸邏輯,但不知道如何開始。

謝謝!

馬修

回答

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並不總是大於同一鏈中的先前目標ID ...所以ID 1可以合併爲3,然後3可以合併爲2,例如 – tjeuten 2010-09-14 15:00:22

+0

可以通過向合併信息添加時間戳並選擇「按日期排序的前1個順序」方法來解決此問題。但想知道是否可以不加時間戳 – tjeuten 2010-09-14 15:09:48

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 2010-09-14 15:37:34

+0

謝謝馬丁。 – 2010-09-14 18:32:43

相關問題