簡體   English   中英

如何使用 rowid 和 rownum 在合並語句中添加兩個條件

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM