[英]How to add two conditions in merge statement using rowid and rownum
CREATE SEQUENCE e_demo2_tab_sq;
CREATE TABLE e_demo2_tab
(
tab_id NUMBER(10) DEFAULT e_demo2_tab_sq.nextval NOT NULL,
e_id NUMBER(10),
e_uuid NUMBER(10),
seq_cnt NUMBER(10)
);
INSERT INTO e_demo2_tab VALUES(e_demo2_tab_sq.nextval, 11, 13, null);
INSERT INTO e_demo2_tab VALUES(e_demo2_tab_sq.nextval, 11, 13, null);
INSERT INTO e_demo2_tab VALUES(e_demo2_tab_sq.nextval, 11, 16, null);
INSERT INTO e_demo2_tab VALUES(e_demo2_tab_sq.nextval, 11, 15, null);
INSERT INTO e_demo2_tab VALUES(e_demo2_tab_sq.nextval, 11, 14, null);
INSERT INTO e_demo2_tab VALUES(e_demo2_tab_sq.nextval, 11, 14, null);
INSERT INTO e_demo2_tab VALUES(e_demo2_tab_sq.nextval, 11, 15, null);
INSERT INTO e_demo2_tab VALUES(e_demo2_tab_sq.nextval, 11, 16, null);
查詢以加載e_uuid
13 和 15 的序列
merge into e_demo2_tab a
using (select
rowid rid,
row_number() over (partition by e_id, e_uuid order by rowid) rn
from e_demo2_tab where e_uuid in(13,15)
) x
on (a.rowid = x.rid)
when matched then update set a.seq_cnt = x.rn;
然后我想將e_uuid
14 & 16 合並到同一個表中 For 14: 它應該檢查e_uuid
= 13 和 maximum seq_cnt
。 這里(執行我的合並語句后)最大seq_cnt
是 2 那么 14 的seq_cnt
將是 3 和 4。如果有任何 null 值,則需要在seq_cnt
中默認給出 1
對於 16:它應該檢查e_uuid
= 15 和 maximum seq_cnt
。 這里(執行我的合並語句后)最大seq_cnt
是 2 那么 16 的seq_cnt
將是 3 和 4。
Output 執行上面給出的合並語句后
+--------+------+--------+---------+
| TAB_ID | E_ID | E_UUID | SEQ_CNT |
+--------+------+--------+---------+
| 1 | 11 | 13 | 1 |
| 2 | 11 | 13 | 2 |
| 3 | 11 | 16 | null |
| 4 | 11` | 15 | 1 |
| 5 | 11 | 14 | null |
| 6 | 11 | 14 | null |
| 7 | 11 | 15 | 2 |
| 8 | 11 | 16 | null |
+--------+------+--------+---------+
預計 Output:
+--------+------+--------+---------+
| TAB_ID | E_ID | E_UUID | SEQ_CNT |
+--------+------+--------+---------+
| 1 | 11 | 13 | 1 |
| 2 | 11 | 13 | 2 |
| 3 | 11 | 16 | 3 |
| 4 | 11` | 15 | 1 |
| 5 | 11 | 14 | 3 |
| 6 | 11 | 14 | 4 |
| 7 | 11 | 15 | 2 |
| 8 | 11 | 16 | 4 |
+--------+------+--------+---------+
如果您想將一個奇數和一個連續的偶數 e_uuid 組合在一起,您總是可以將partition by
子句更改為 group on ceil(e_uuid/2)
,如下所示:
merge into e_demo2_tab a
using (select
rowid rid,
row_number() over (partition by e_id, ceil(e_uuid/2) order by e_uuid, rowid) rn
from e_demo2_tab) x
on (a.rowid = x.rid)
when matched then update set a.seq_cnt = x.rn;
這是有效的,因為 13/2 = 6.5,上限值為 6.5 = 7。14/2 = 7,其上限值也是 7,因為它已經是 integer。這使得 13 和 14 組合在一起 - 適用相同的邏輯到 15 和 16 - 兩個值的上限都為 8。
這樣就解釋了將它們組合在一起背后的邏輯(13 是奇數,14 是下一個連續的偶數)。
然后按 e_uuid 和 rowid 對行進行排序以獲得您之后的排序。
如果您只關心 13、14、15 和 16 個 e_uuids,您可能希望在where e_uuid in (13, 14, 15, 16)
的 x 子查詢中有一個過濾器,具體取決於是否有其他值表中的 e_uuid。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.