如果下一组增加10,并按顺序更新流后,该组已更改。
我的逻辑是将第一行与另一行进行比较,如果第一行与另一行的时间递增1匹配,否则与该行的时间递增10不匹配。
declare
v_groupid varchar2(100);
v_gameid varchar2(100);
v_teamid varchar2(200);
v_chest_no number;
stmt VARCHAR2(2000);
count1 number;
temp number :=1;
cursor c_stage is select distinct var_group_id from aokk_group_def where var_group_type='KR'
and var_group_category='T';
begin
- open c_stage;
loop
fetch c_stage into v_groupid;
exit when c_stage%notfound;
for i in (select distinct var_kalateamappreg_teamid,var_kalateamappreg_groupid from aokk_kalateamappreg_stage where
var_kalateamappreg_groupid between 'GR14' and 'GR17' order by var_kalateamappreg_groupid )
loop
for j in (select distinct var_kalateamappreg_teamid,var_kalateamappreg_groupid from aokk_kalateamappreg_stage where
var_kalateamappreg_groupid between 'GR14' and 'GR17' order by var_kalateamappreg_groupid )
loop
if (i.var_kalateamappreg_teamid=j.var_kalateamappreg_teamid)
then
UPDATE aokk_kalateamappreg_stage SET aokk_kalateamappreg_CHESTNO=temp
WHERE var_kalateamappreg_groupid=i.var_kalateamappreg_groupid and
var_kalateamappreg_teamid=i.var_kalateamappreg_teamid;
temp:=temp+1;
elsif (i.var_kalateamappreg_teamid<>j.var_kalateamappreg_teamid)
then
UPDATE aokk_kalateamappreg_stage SET aokk_kalateamappreg_CHESTNO=temp
WHERE var_kalateamappreg_groupid=i.var_kalateamappreg_groupid and
var_kalateamappreg_teamid=i.var_kalateamappreg_teamid;
temp:=temp+10;
end if;
end loop;
end loop;
end loop;
close c_stage;
end;
我更新了表中的组ID,但尚未正确更新。
输出:
VAR_KALATEAMAPPREG_TEAMID VAR_KALATEAMAPPREG_GROUPID AOKK_KALATEAMAPPREG_CHESTNO
281 GR14 43285
283 GR14 43336
267 GR14 43183
249 GR14 43132
248 GR14 43081
247 GR14 43030
240 GR14 42877
244 GR14 42928
238 GR14 42826
280 GR14 43234
320 GR14 43387
246 GR14 42979
239 GR16 43538
326 GR16 43689
270 GR17 43839
273 GR17 44121
271 GR17 43980
预期输出:
VAR_KALATEAMAPPREG_TEAMID VAR_KALATEAMAPPREG_GROUPID AOKK_KALATEAMAPPREG_CHESTNO
238 GR14 42826
240 GR14 42827
244 GR14 42928
246 GR14 42929
247 GR14 42930
248 GR14 42931
249 GR14 42932
267 GR14 42933
280 GR14 42934
281 GR14 42935
283 GR14 42936
320 GR14 42937
239 GR16 42948 Increment by 10
326 GR16 42949
270 GR17 42950 Increment by 10
271 GR17 42951
273 GR17 42952
如果在胸部编号之后组也改变了,则编号也增加了10。
您可以避免PLSQL并在递归查询中使用merge
,其中,根据组的更改,计数器增加一或十(加一):
merge into stage
using (
with
d as (
select teamid, groupid, chestno,
row_number() over (order by groupid, teamid) rn
from stage where groupid between 'GR14' and 'GR17' ),
c(teamid, groupid, rn, newchestno) as (
select teamid, groupid, rn, chestno from d where rn = 1
union all
select d.teamid, d.groupid, d.rn,
c.newchestno + case c.groupid when d.groupid then 1 else 11 end
from c join d on d.rn = c.rn + 1 )
select * from c) r
on (stage.teamid = r.teamid and stage.groupid = r.groupid)
when matched then update set chestno = newchestno
[dbfiddle] >>