递归sql查询获取变更历史

Recursive sql query to obtain change history

考虑 table

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 7又来自uid 10增加10。uid=10是初始记录。

我想创建一个 sql 将 uid 作为参数并将 return 给定 uid 的所有历史记录。

从上面的例子中,查询将return除了curuid=4的那条记录(与记录5的历史无关)之外的所有记录

5   7   40  increase by 20
7   10  20  decrease by 10
10      30  

知道怎么做吗?

使用分层查询,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;

输出:

CURUID | PREVUID | AMOUNT | REASON        
-----: | ------: | -----: | :-------------
     5 |       7 |     40 | increase by 20
     7 |      10 |     20 | decrease by 10
    10 |    null |     30 | null          

db<>fiddle here