如何将序列号更新到包含数据的现有表


CREATE TABLE e_demo_tab (
e_id     NUMBER(10),
e_uuid   NUMBER(10),
seq_cnt  NUMBER(10)
);
INSERT INTO e_demo_tab VALUES(11,13,null);
INSERT INTO e_demo_tab VALUES(11,13,null);
INSERT INTO e_demo_tab VALUES(11,14,null);
INSERT INTO e_demo_tab VALUES(11,14,null);
INSERT INTO e_demo_tab VALUES(12,15,null);
INSERT INTO e_demo_tab VALUES(12,15,null);

我有一个表e_demo_tab,其中我必须基于e_uuid列更新seq_cnt列。如果对于相同的e_id,例如11,我们有e_uuid列为13,它出现了两次,因此seq_cnt应该分别更新为1和2,同样地,对于同一e_id,即11,对于e_uuid14,它应该再次将计数分别更新为2和1。我想知道这是否可以使用row_num来处理。请提出建议。

预期输出:

+------+--------+---------+--+
| E_ID | E_UUID | SEQ_CNT |  |
+------+--------+---------+--+
|   11 |     13 |       1 |  |
|   11 |     13 |       2 |  |
|   11 |     14 |       1 |  |
|   11 |     14 |       2 |  |
|   12 |     15 |       1 |  |
|   12 |     15 |       2 |  |
+------+--------+---------+--+

一个选项是使用ROW_NUMBER分析函数("创建"序列号(,然后在ROWID上使用MERGE(因为没有任何列可以唯一表示一行(。

SQL> merge into e_demo_tab a
2    using (select
3             rowid rid,
4             row_number() over (partition by e_id, e_uuid order by rowid) rn
5           from e_demo_tab
6          ) x
7  on (a.rowid = x.rid)
8  when matched then update set a.seq_cnt = x.rn;
6 rows merged.
SQL> select * from e_demo_tab order by e_id, e_uuid, seq_cnt;
E_ID     E_UUID    SEQ_CNT
---------- ---------- ----------
11         13          1
11         13          2
11         14          1
11         14          2
12         15          1
12         15          2
6 rows selected.
SQL>

最新更新