Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 使用while循环进行oracle更新_Sql_Oracle_Oracle11g - Fatal编程技术网

Sql 使用while循环进行oracle更新

Sql 使用while循环进行oracle更新,sql,oracle,oracle11g,Sql,Oracle,Oracle11g,我需要用表A中的数据更新表b,请告知, 请把箱子打开 表A如下: 表B如下: ---------------------------------------------------------- |ID | count | value | settlementvalue | mode | ---------------------------------------------------------- 10 1 100 10

我需要用表A中的数据更新表b,请告知, 请把箱子打开

表A如下:


表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)0,然后_mode+VALUE,否则null结束为mode非常感谢您的宝贵贡献