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_uuid
14,它应该再次将计数分别更新为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>