我有一个包含重复行但 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 |
+----+------------+----------+
您可以使用临时表来存储组的值:
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;
我认为不需要基于您的情况的序列,您可以在带有
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