递归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查询获取更改历史的主要内容,如果未能解决你的问题,请参考以下文章

SQL查询以递归方式获取经理下所有员工的姓名

SQL 查询以获取每个经理下的员工的递归计数

sql server使用cte递归查询获取树形的父节点/子节点

SQL递归获取所有父节点的函数

sql实际应用-递归查询

sql server 递归查询