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
我有 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