Sie können recursive query
und parameterized macro
verwenden, um Ihr gewünschtes Ergebnis zu erhalten.
Erstellen Sie macro
wie folgt.
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;);
es dann ausführen mit Hist Id
als Eingang (in Ihrem Fall seine 123
. Sie können auch andere hist Id
heißt 234
, 345
verwenden).
EXEC Find_New_Id(123);
Es wird Ergebnis wie folgt erzeugen.
new_Id
-------
456
Hoffe, das wird helfen.
Edit:
Nach dnoeth Vorschläge, finden Sie die einfachere Version der ursprünglichen Abfrage.
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;);
Sie sollten eine Spalte erstellen Sie Ihre hist ID, um zu speichern, um sie später abrufen – Misery
mit 'MAX()' Sie die neueste ID finden können, wenn sie Auto Spalte – Riad
Tag die dbms erhöht ist Sie verwenden. Die Antwort kann produktspezifische Funktionalität verwenden. – jarlh