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

SQL query to find last created records in the table

我有 table 叫 Tbl_Dom

列是

ID, Original_id, name

示例数据:

Original_id    ID              Name
-------------------------------------
NULL          82051            DOM
82051         122575           SAT
122575        123598           sam

在此table中,首先在此table中创建了ID:82051,然后根据第一条记录的ID 82051创建了第二条记录(这样n条记录将是已创建)将被引用 ID:122575.

当创建第三条记录时,原始 Id 将引用两个第二条记录 id:122575 但基本上它来自 82051。

问题: 我知道旧 ID:82051 - 通过使用这个如何从 table.[=17 中找到最近创建的 Id:123598 =]

我试图达到这个目的,但无法得到预期的结果。

Select id 
from dom t 
where original_id in (select original_id from dom t1)

我的预期输出是:

id: 123598  original id: 122575 name : sam

您可以将递归 CTE 与 window 函数结合使用,如:

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 是遍历所有级别所必需的。在某些情况下,您可能需要走一个级别(或 none),但在其他情况下,可能需要走多个级别。

赠金查询(同价):

此外,如果(只是为了好玩?)您想要获取一行的所有更新版本,您可以这样做:

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

subquery和left join能找到最近的

    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