递归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
考虑 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