oracle обновление с циклом while - PullRequest
1 голос
/ 15 февраля 2020

Мне нужно обновить таблицу b данными из таблицы A, пожалуйста, сообщите, пожалуйста, случай

Таблица A, как показано ниже


|ID    |       balance|
-----------------------
|10    |       360    |
-----------------------
|20    |       300    |
-----------------------

Таблица B, как показано ниже

----------------------------------------------------------
|ID   |  count   |    value   |  settlementvalue |  mode |
----------------------------------------------------------

10     1           100        100 
10     2           100        100
10     3           100        null
10     4           100        null
10     5           100        null
10     6           100        null
10     7           100        null
10     8           100        null
10     9           100        null
10     10          100        null

20     1           100        100
20     2           100        null
20     3           100        null
20     4           100        null
20     5           100        null
20     6           100        null
20     7           100        null
20     8           100        null
20     9           100        null
20    10           100        null

мне нужно прочитать баланс из таблицы A и обновить первое нулевое значение в расчетном значении в таблице B значением в столбце, а затем уменьшить остаток, затем мы go обновим следующую строку, пока баланс не станет меньше значения, которое мы поместим в столбец мод

конечный результат должен быть таким, как показано ниже: таблица B, как показано ниже

ID     count       value     settlementvalue   mode
10     1           100        100
10     2           100        100
10     3           100        100
10     4           100        100
10     5           100        100              
10     6           100        null              60
10     7           100        null
10     8           100        null
10     9           100        null
10     10          100        null

20     1           100        100
20     2           100        100
20     3           100        100
20     4           100        100
20     5           100        null
20     6           100        null
20     7           100        null
20     8           100        null

1 Ответ

1 голос
/ 15 февраля 2020

Вы можете сделать это таким образом, используя функции cte и windows. Для этого вам не понадобятся циклы while.

    with _modeTbl as
(
select b.*, a.balance ,
balance - sum(value) OVER (PARTITION BY a.ID ORDER BY count ROWS BETWEEN UNBOUNDED PRECEDING and CURRENT ROW) as _mode
from tableA a inner join tableB b on a.ID = b.ID where settlementvalue is null
),
finalcte as
(
select ID, count, value 
,case when _mode > = 0 then value else null end as settlementvalue
,case when _mode < value and _mode > 0 then _mode else null end as mode
from _modeTbl
union
select *
from tableB where settlementvalue is not null
)
select ID, count, value, settlementvalue,
lag(mode) OVER (PARTITION BY ID ORDER BY ID) as mode
from finalcte

Вывод:

ID  count   value   settlementvalue mode
10     1    100      100            NULL
10     2    100      100            NULL
10     3    100      100            NULL
10     4    100      100            NULL
10     5    100      100            NULL
10     6    100      NULL           60
10     7    100      NULL           NULL
10     8    100      NULL           NULL
10     9    100      NULL           NULL
10     10   100      NULL           NULL
20     1    100      100            NULL
20     2    100      100            NULL
20     3    100      100            NULL
20     4    100      100            NULL
20     5    100      NULL           NULL
20     6    100      NULL           NULL
20     7    100      NULL           NULL
20     8    100      NULL           NULL
20     9    100      NULL           NULL
20     10   100      NULL           NULL
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...