我有一个名为Tbl_Dom
的表。
列是
ID, Original_id, name
样本数据:
Original_id ID Name
-------------------------------------
NULL 82051 DOM
82051 122575 SAT
122575 123598 sam
在此表中,首先在该表中创建ID:82051,然后根据ID 82051从第一条记录创建了第二条记录(如将创建n条记录),该记录将被称为ID:122575。
在创建第三条记录时,原始ID将引用两个第二条记录ID:122575,但基本上是从82051开始的。
问题::我知道旧的ID:82051-使用此方法从表中查找最近创建的ID:123598。
我试图做到这一点,但无法获得预期的结果。
Select id
from dom t
where original_id in (select original_id from dom t1)
我的预期输出是:
id: 123598 original id: 122575 name : sam
答案 0 :(得分:3)
您可以将递归CTE与窗口函数结合使用,如下所示:
with
r as (
select original_id, id, name, 1 as version from Tbl_Dom where ID = 82051
union all
select t.original_id, t.id, t.name, r.version + 1
from Tbl_Dom t
join r on t.original_id = r.id
),
x as (
select
original_id, id, name,
row_number() over(order by version desc) as rn
from r
)
select original_id, id, name
from x
where rn = 1
结果:
original_id id name
----------- ------ ----
122575 123598 sam
递归CTE是遍历所有级别所必需的。在某些情况下,您可能需要走一个台阶(或根本不走),但在其他情况下,可能要走多个台阶。
奖金查询(价格相同):
另外,如果(只是为了好玩?)您想要获得所有新版本的行,可以执行以下操作:
with
r as (
select original_id, id, name, 1 as version from Tbl_Dom where ID = 82051
union all
select t.original_id, t.id, t.name, r.version + 1
from Tbl_Dom t
join r on t.original_id = r.id
)
select * from r order by version
结果:
original_id id name version
----------- ------ ---- -------
<null> 82051 DOM 1
82051 122575 SAT 2
122575 123598 sam 3
答案 1 :(得分:0)
子查询和左联接可以找到最近的一个
with Tbl_Dom as
(
select null Original_id,82051 as ID ,'DOM' as Name
union all
select 82051,122575,'SAT'
union all
select 122575,123598,'sam'
) select a.id from
(
select id from Tbl_Dom
) a left join
(
select Original_id as id from Tbl_Dom where Original_id is not null
) b on a.id=b.id where b.id is null
输出
id
123598