【问题标题】:SQL query to find last created records in the tableSQL查询查找表中最后创建的记录
【发布时间】:2019-03-14 18:23:26
【问题描述】:

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

【问题讨论】:

  • ID 会一直按递增顺序创建吗?
  • 不,它不会为这些记录创建下一个增量编号。

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


【解决方案1】:

您可以将递归 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

【讨论】:

  • 这个显示原始 id 中的 null : original_id id name rn NULL 82051 DOM 1 我期待 id:123598 原始 id:122575
  • 现在已经修复了。
【解决方案2】:

子查询和左连接可以找到最近的一个

    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

【讨论】:

  • 感谢您的发帖。在这里,您已静态选择表记录。我的问题是我们如何从 id: 82051 from table 中选择这些记录
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多