考虑一张桌子
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
任何想法如何做到这一点?
使用分层查询和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
希望你有一个id列指定no。和表中的记录顺序。
select * from table where id> =(从表中选择id,其中uid = 5);
说明
获取特定uid的id。然后获取所有id>而不是uid的id。
如果id不可用,则查找任何可用的时间戳或不断增长的内容。
对于递归使用触发器和下面的查询将与触发器一起使用。
* select * from table where uid =(从表格中选择curid,其中uid = 5); *