2017-08-17 61 views
0

我目前有以下情形:我有一段時間內更改的ID(主鍵)。在此過程中,我需要找出具有歷史ID的最新ID作爲參考。找到具有歷史ID的最新ID

對於離:

Hist ID New ID 
123  234 
234  345 
345  456 

在上述採樣數據,123是已知歷史鍵,我需要檢索當前ID即456

上如何可以通過實施任何建議SQL將不勝感激。

謝謝。

+0

您應該創建一個列來存儲您的HIST ID,以便以後使用 – Misery

+0

檢索它'MAX()'你可以找到最新的ID,如果它是自動遞增列 – Riad

+3

標籤您正在使用的數據庫管理系統。答案可能會使用產品特定的功能。 – jarlh

回答

0

您可以添加列作爲date_created並添加數據時添加日期時間。之後,您可以在桌上找到top 1 from NewIDdate_created DESC過濾器。

1

你可以使用recursive queryparameterized macro來得到你想要的結果。

創建macro如下。

REPLACE MACRO Find_New_Id(old_id INT) AS(WITH RECURSIVE id_map(hist_id, new_id, depth) AS 
    (SELECT hist_id, 
      new_id, 
      0 
    FROM id_tbl 
    WHERE hist_id = :old_id 
    UNION ALL SELECT im.hist_id, 
        it.new_id, 
        depth+1 
    FROM id_map im 
    JOIN id_tbl it ON im.new_id = it.hist_id 
    AND im.hist_id <> it.new_id) 
SELECT id_m.new_id 
FROM id_map id_m JOIN 
    (SELECT Max(depth) AS Depth_val 
    FROM id_map) AS tbl_depth 
ON id_m.depth = tbl_depth.Depth_val;); 

然後用Hist Id作爲輸入執行它(在你的情況下,它123。您也可以使用任何其他hist Id234345)。

EXEC Find_New_Id(123); 

它會產生如下結果。

new_Id 
------- 
456 

希望這會有所幫助。

編輯:

dnoeth建議後,以下是初始查詢的簡化版本。

REPLACE MACRO Find_New_Id(old_id INT) AS(WITH RECURSIVE id_map(hist_id, new_id, depth) AS 
    (SELECT hist_id, 
      new_id, 
      0 
    FROM id_tbl 
    WHERE hist_id = :old_id 
    UNION ALL SELECT im.hist_id, 
        it.new_id, 
        depth+1 
    FROM id_map im 
    JOIN id_tbl it ON im.new_id = it.hist_id 
    AND im.hist_id <> it.new_id) 
SELECT TOP 1 new_id 
FROM id_map 
ORDER BY depth DESC;);