递归sql查询获取更改历史
Posted
技术标签:
【中文标题】递归sql查询获取更改历史【英文标题】:Recursive sql query to obtain change history 【发布时间】:2019-02-20 13:41:39 【问题描述】:考虑一个表格
with test_tbl as (
select 5 as curuid, 7 as prevuid, 40 amount, 'increase by 20' reason from dual
union
select 7 as curuid,10 as prevuid,20 amount ,'decrease by 10' reason from dual
union
select 10 as curuid,null as prevuid,30 amount, null reason from dual
union
select 4 as curuid,null as prevuid,50 amount, null reason from dual
)
select * from test_tbl
每条记录都有一个current uid
和一个amount
。
现在,每次amount
发生更改时,都会使用新的uid
创建新记录,并将其先前的uid
设置为正在更改的记录的uid
,更改的原因是放。
因此,uid 5 来自 uid 7 增加 20,而后者又来自 uid 10 增加 10。uid=10 是初始记录。
我想创建一个将 uid 作为参数并返回给定 uid 的所有历史记录的 sql。
从上面的例子中,查询会返回除curuid=4之外的所有记录(这与记录5的历史无关)
5 7 40 increase by 20
7 10 20 decrease by 10
10 30
任何想法如何做到这一点?
【问题讨论】:
【参考方案1】:使用分层查询和START WITH
uid
您要获取其历史记录:
Oracle 设置:
CREATE TABLE test_tbl (curuid, prevuid, amount, reason ) as
SELECT 5, 7, 40, 'increase by 20' FROM DUAL UNION ALL
SELECT 7, 10, 20, 'decrease by 10' FROM DUAL UNION ALL
SELECT 10, NULL, 30, NULL FROM DUAL UNION ALL
SELECT 4, NULL, 50, NULL FROM DUAL;
查询:
select *
from test_tbl
start with curuid = 5
connect by PRIOR prevuid = curuid;
输出:
库鲁伊 |预览 |数量 |原因 -----: | ------: | -----: | :------------- 5 | 7 | 40 |增加 20 7 | 10 | 20 |减少 10 10 | 空 | 30 | 空db小提琴here
【讨论】:
以上是关于递归sql查询获取更改历史的主要内容,如果未能解决你的问题,请参考以下文章