2017-08-17 1 views
0

Ich habe derzeit das folgende Szenario: Ich habe eine ID (Primärschlüssel) über einen Zeitraum geändert. Während des Prozesses muss ich die neueste ID mit historischer ID als Referenz herausfinden.Finden Sie die neueste ID mit historischer ID

Für Ex:

Hist ID New ID 
123  234 
234  345 
345  456 

In den obigen Beispieldaten, 123 sind die bekannten historischen Schlüssel und ich brauche die aktuelle ID dh 456.

Jeden Vorschlag auf abzurufen, wie dies könnte über implementiert werden sql würde sehr geschätzt werden.

Vielen Dank.

+0

Sie sollten eine Spalte erstellen Sie Ihre hist ID, um zu speichern, um sie später abrufen – Misery

+0

mit 'MAX()' Sie die neueste ID finden können, wenn sie Auto Spalte – Riad

+3

Tag die dbms erhöht ist Sie verwenden. Die Antwort kann produktspezifische Funktionalität verwenden. – jarlh

Antwort

0

Sie können die Spalte als date_created hinzufügen und datetime hinzufügen, wenn Daten hinzugefügt werden. Danach können Sie top 1 from NewID mit date_created DESC Filter auf Tabelle finden.

1

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;); 
Verwandte Themen