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

问题描述 投票:0回答:2

考虑一张桌子

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

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

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

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

任何想法如何做到这一点?

sql oracle oracle10g
2个回答
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
投票

希望你有一个id列指定no。和表中的记录顺序。

select * from table where id> =(从表中选择id,其中uid = 5);

说明

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

如果id不可用,则查找任何可用的时间戳或不断增长的内容。

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

* select * from table where uid =(从表格中选择curid,其中uid = 5); *

© www.soinside.com 2019 - 2024. All rights reserved.