在重复的行中合并更新 oracle

问题描述 投票:0回答:2

我有一个包含重复行但 group_id 字段为空的表:

+----+------------+-----+-----  
| id | reference1 | group_id |  
+----+------------+-----+-----  
| 1  | AAAA       |          |  
| 2  | AAAA       |          |  
| 3  | AAAA       |          |   
| 4  | BBBB       |          |  
| 5  | BBBB       |          |  
| 6  | CCCC       |          |  
| 7  | CCCC       |          |  
| 8  | CCCC       |          |  
| 9  | CCCC       |          |  
| 10 | CCCC       |          |  
+----+------------+----------+

我需要在 group_id 字段中添加一个数字,只要它为 null 并且我使用:

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;

这只是为每条记录添加了一个数字,如下所示:

+----+------------+-----+-----  
| id | reference1 | group_id |  
+----+------------+-----+-----  
| 1  | AAAA       |    1     |  
| 2  | AAAA       |    2     |  
| 3  | AAAA       |    3     |   
| 4  | BBBB       |    4     |  
| 5  | BBBB       |    5     |  
| 6  | CCCC       |    6     |  
| 7  | CCCC       |    7     |  
| 8  | CCCC       |    8     |  
| 9  | CCCC       |    9     |  
| 10 | CCCC       |    10    |  
+----+------------+----------+

但是我需要为每组重复记录分配一个数字例如:

+----+------------+-----+-----  
| id | reference1 | group_id |  
+----+------------+-----+-----  
| 1  | AAAA       |    1     |  
| 2  | AAAA       |    1     |  
| 3  | AAAA       |    1     |   
| 4  | BBBB       |    2     |  
| 5  | BBBB       |    2     |  
| 6  | CCCC       |    3     |  
| 7  | CCCC       |    3     |  
| 8  | CCCC       |    3     |  
| 9  | CCCC       |    3     |  
| 10 | CCCC       |    3     |  
+----+------------+----------+
oracle stored-procedures oracle-sqldeveloper plsqldeveloper
2个回答
0
投票

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

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;

0
投票

我认为不需要基于您的情况的序列,您可以在带有

DENSE_RANK()
选项的
MERGE
语句中使用
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

演示

© www.soinside.com 2019 - 2024. All rights reserved.