SQL查询以查找表中最后创建的记录

时间:2019-03-14 18:23:26

标签: sql sql-server-2008 sql-server-2012

我有一个名为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

2 个答案:

答案 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

demo link