Рекурсивный SQL-запрос для получения истории изменений - PullRequest
0 голосов
/ 20 февраля 2019

Рассмотрим таблицу

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, увеличенного на 10. uid = 10 был исходной записью.

Я хотел бы создать sql, который будет принимать uid в качестве параметра и будет возвращать всю историю для данного uid.

Из приведенного выше примера запрос вернет все записи, кроме записи с curuid = 4 (которая не имеет никакого отношения к истории записи 5)

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

Anyидеи как это сделать?

Ответы [ 2 ]

0 голосов
/ 20 февраля 2019

Надеюсь, у вас есть столбец id , указывающий номер.и порядок записи в таблице.

выберите * из таблицы, где id> = (выберите id из таблицы, где uid = 5);

Пояснение

get id для определенного uid .затем извлеките все id > , чем идентификатор uid .

Если идентификатор недоступен, ищите метка времени любой доступный илито, что постоянно растет.

для рекурсии используйте триггер и запрос ниже, будет использоваться с триггер .

* select * from table, где uid =(выберите currid из таблицы, где uid = 5); *

0 голосов
/ 20 февраля 2019

Используйте иерархический запрос и 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 |    <em>null</em> |     30 | <em>null</em>          

db <> скрипка здесь

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...