我目前有以下情况:我有一段ID(主键)在一段时间内发生变化。在此过程中,我需要找出带有历史ID的最新ID作为参考。
例如:
Hist ID New ID
123 234
234 345
345 456
在上面的示例数据中,123是已知的历史密钥,我需要检索当前的ID,即456.
关于如何通过sql实现这一点的任何建议都将受到高度赞赏。
谢谢。
答案 0 :(得分:1)
您可以使用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;);
答案 1 :(得分:0)
您可以将列添加为date_created,并在添加数据时添加日期时间。之后,您可以在表格中找到top 1 from NewID
过滤器date_created DESC
。