Sql 使用while循环进行oracle更新
我需要用表A中的数据更新表b,请告知, 请把箱子打开 表A如下:Sql 使用while循环进行oracle更新,sql,oracle,oracle11g,Sql,Oracle,Oracle11g,我需要用表A中的数据更新表b,请告知, 请把箱子打开 表A如下: 表B如下: ---------------------------------------------------------- |ID | count | value | settlementvalue | mode | ---------------------------------------------------------- 10 1 100 10
表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
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
我需要从表A中读取余额,并使用列值中的值更新表B中结算值中的第一个空值,然后减少余额,然后我们继续更新下一行,直到余额小于我们将放入mod列中的值
最终结果应如下所示:
表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
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
通过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------结算值------mode------10------5------100------100------NULL------10------6------100------NULL------60------我已修复它。让我知道,我修复了第一个解决方案,因为我将最后一个case when子句更改为belo case when mode<0和ABS(_mode)