我目前有以下情形:我有一段時間內更改的ID(主鍵)。在此過程中,我需要找出具有歷史ID的最新ID作爲參考。找到具有歷史ID的最新ID
對於離:
Hist ID New ID
123 234
234 345
345 456
在上述採樣數據,123是已知歷史鍵,我需要檢索當前ID即456
上如何可以通過實施任何建議SQL將不勝感激。
謝謝。
我目前有以下情形:我有一段時間內更改的ID(主鍵)。在此過程中,我需要找出具有歷史ID的最新ID作爲參考。找到具有歷史ID的最新ID
對於離:
Hist ID New ID
123 234
234 345
345 456
在上述採樣數據,123是已知歷史鍵,我需要檢索當前ID即456
上如何可以通過實施任何建議SQL將不勝感激。
謝謝。
您可以添加列作爲date_created並添加數據時添加日期時間。之後,您可以在桌上找到top 1 from NewID
和date_created DESC
過濾器。
你可以使用recursive query
和parameterized 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 Id
即234
,345
)。
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;);
您應該創建一個列來存儲您的HIST ID,以便以後使用 – Misery
檢索它'MAX()'你可以找到最新的ID,如果它是自動遞增列 – Riad
標籤您正在使用的數據庫管理系統。答案可能會使用產品特定的功能。 – jarlh