考虑表格
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
任何想法该怎么做?
答案 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); *