合并重复行中的更新oracle

6vl6ewon  于 2023-03-17  发布在  Oracle
关注(0)|答案(2)|浏览(175)

我有一个表,其中有重复的行,但group_id字段为空:
| 身份证|参考文献1|组标识|
| - ------|- ------|- ------|
| 1个|AAAA级||
| 第二章|AAAA级||
| 三个|AAAA级||
| 四个|BBBB公司||
| 五个|BBBB公司||
| 六个|中交||
| 七|中交||
| 八个|中交||
| 九|中交||
| 十个|中交||
只要group_id字段为空,我就需要在其中添加一个数字,并用途:

UPDATE journals_cv027_tab f1
   SET f1.group_id = journals_seq.nextval
 WHERE f1.group_id IS NULL
   AND EXISTS (SELECT reference1
                 FROM journals_cv027_tab c
                WHERE c.reference1 = f1.reference1);
COMMIT;

这只是为每条记录添加了一个编号,如下所示:
| 身份证|参考文献1|组标识|
| - ------|- ------|- ------|
| 1个|AAAA级|1个|
| 第二章|AAAA级|第二章|
| 三个|AAAA级|三个|
| 四个|BBBB公司|四个|
| 五个|BBBB公司|五个|
| 六个|中交|六个|
| 七|中交|七|
| 八个|中交|八个|
| 九|中交|九|
| 十个|中交|十个|
但我需要为每组重复记录分配一个编号,例如:
| 身份证|参考文献1|组标识|
| - ------|- ------|- ------|
| 1个|AAAA级|1个|
| 第二章|AAAA级|1个|
| 三个|AAAA级|1个|
| 四个|BBBB公司|第二章|
| 五个|BBBB公司|第二章|
| 六个|中交|三个|
| 七|中交|三个|
| 八个|中交|三个|
| 九|中交|三个|
| 十个|中交|三个|

goucqfw6

goucqfw61#

我认为不需要根据您的情况设置顺序,您可以在MERGE语句中使用DENSE_RANK()解析函数,并带有MATCHED选项,假定id是主键,可以很容易地在子查询的匹配条件中使用,例如

MERGE INTO journals_cv027_tab j1 
     USING 
     (SELECT j.*, 
             DENSE_RANK() OVER (ORDER BY reference1) AS dr
        FROM journals_cv027_tab j) j2
          ON ( j2.id = j1.id )
      WHEN MATCHED THEN UPDATE SET j1.group_id = dr
     WHERE j1.group_id IS NULL

Demo
如果希望保留序号的值,则可以选择在截断表之前将group_id的最大值存储在具有一行和一列的表中,以便在下一次更新中作为<that value> + DENSE_RANK()...使用

xyhw6mcr

xyhw6mcr2#

可以使用临时表存储组的值:

create table group_journals_cv027_tab
as 
select reference1, 1 as group_id
from journals_cv027_tab 
group by reference1;

update group_journals_cv027_tab 
set group_id = JOURNALS_SEQ.nextval;

merge into journals_cv027_tab f1
using (select group_id, reference1 from group_journals_cv027_tab) s1
on (f1.reference1 = s1.reference1)
when matched then update set f1.group_id = s1.group_id
where f1.group_id is null;

相关问题