2012-12-13 112 views
0

我有一個表,它有兩列。Sql Server遞歸

CurrentNumber | NewNumber 
12345 | 12346 
12346 | 12347 
12347 | NULL 
12349 | NULL 
12350 | 12351 
12351 | NULL 

我希望能夠做的就是把這個視圖弄平如下。創建一個新表

CurrentNumber | OldNumber 
12347 | 12346 
12347 | 12345 
12351 | 12350 

這是我的問題。我可以使用一些嵌套的遊標尋找可能存在的遞歸的數量,但我一直沒能想出辦法找到老號到無窮大。任何幫助,將不勝感激。

我有SQL Server 2008中,2012或MySQL服務器可用,試圖解決這個問題。我也可以編寫外部應用程序來執行此操作,但我必須定期執行此操作,所以如果可能的話,我寧願將它保留在SQL中。

回答

1

試試這個。 SQL Fiddle

CREATE TABLE t 
    ([CurrentNumber] int, [NewNumber] int) 
; 

INSERT INTO t 
    ([CurrentNumber], [NewNumber]) 
VALUES 
    (12345, 12346), 
    (12346, 12347), 
    (12347, NULL), 
    (12349, NULL), 
    (12350, 12351), 
    (12351, NULL) 
; 

;WITH cte AS (
    SELECT [CurrentNumber], CAST(NULL AS INT) AS OldNumber 
    FROM t 
    WHERE NewNumber IS NULL 
    UNION ALL 
    SELECT c.CurrentNumber, t.CurrentNumber AS OldNumber 
    FROM t 
    INNER JOIN cte c 
     ON (ISNULL(c. OldNumber,c.CurrentNumber) = t.NewNumber) 
) 
SELECT * 
FROM cte 
WHere OldNumber IS NOT NULL 
ORDER BY 1,2  
+0

這看起來像是最終答案。我的基本測試似乎證明這是正確的。我能夠通過它的各種超級會議跟隨一個單一的號碼。 – Stormflurry

0

是你想要的嗎?

;with cte as 
      (
       select * 
       from table 
       where NewNumber is not null 
      ), 
     cte2 as 
      (
       select NewNumber CurrentNumber, CurrentNumber OldNumber 
       from cte 
      ) 

select * from cte2 order by CurrentNumber 

如果需要,可以將這些結果插入表中。

+0

這個解決方案非常簡單,讓我感到很震驚。謝謝。剛剛測試過,數據顯示正確,而且速度很快! – Stormflurry

+0

@Stormflurry,該查詢會給你造成的CURRENTNUMBER 12346 OLDNUMBER 12345,這是不同的比你預期的CURRENTNUMBER 12347 OLDNUMBER 12345 – EricZ

+0

似乎有一個問題與此有關。說一個新的數字zig通過一箇舊的數字。所以,我上面的例子在當前號碼是12347,其superceeded 12346這superceeded 12345那種情況下沒有出現在這個例子中進行處理。 – Stormflurry