递归SQL查询以获取更改历史记录

时间:2019-02-20 13:41:40

标签: sql oracle oracle10g

考虑表格

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来自增加了20的uid 7,而uid来自增加了10的uid10。uid = 10是初始记录。

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

在上面的示例中,查询将返回所有记录,但curuid = 4的记录除外(与记录5的历史记录无关)

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

任何想法该怎么做?

2 个答案:

答案 0 :(得分: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;

输出

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

db <>提琴here

答案 1 :(得分:-1)

希望U的 id 列中指定了编号。和表中的记录顺序。

从id> =的表中选择*(从uid = 5的表中选择id);

说明

获取特定 uid id 。然后获取所有 id > ,而不是 uid的

如果没有可用的ID,请寻找时间戳任何可用的或持续增长的内容。

对于递归使用触发器,下面的查询将与 trigger 一起使用。

*从uid =的表中选择*(从uid = 5的表中选择currid); *