如何使用 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 合并到同一个 table
对于 14:它应该检查 e_uuid
= 13 和最大值 seq_cnt
。这里(执行我的合并语句后)最大值 seq_cnt
是 2 然后 seq_cnt
for 14 将作为 3 & 4 出现。如果有任何空值则需要在 [=17 中默认给出 1 =]
对于 16:它应该检查 e_uuid
= 15 和最大值 seq_cnt
。这里(执行我的合并语句后)最大值 seq_cnt
是 2 那么 16 的 seq_cnt
将作为 3 和 4.
执行上面给出的合并语句后的输出
+--------+------+--------+---------+
| 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 |
+--------+------+--------+---------+
预期输出:
+--------+------+--------+---------+
| 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
子句更改为在 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,因为它已经是一个整数。这使得 13 和 14 组合在一起 - 相同的逻辑适用于 15 和 16 - 它们的上限除以 2 得到两个值的 8。
这就解释了将它们组合在一起的逻辑(13 是奇数,14 是下一个连续的偶数)。
然后按 e_uuid 对行进行排序,然后按 rowid 进行排序以获得您想要的顺序。
如果您只关心 13、14、15 和 16 e_uuid,您可能希望在 where e_uuid in (13, 14, 15, 16)
的 x 子查询中有一个过滤器,具体取决于是否有table.
中 e_uuid 的其他值
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 合并到同一个 table
对于 14:它应该检查 e_uuid
= 13 和最大值 seq_cnt
。这里(执行我的合并语句后)最大值 seq_cnt
是 2 然后 seq_cnt
for 14 将作为 3 & 4 出现。如果有任何空值则需要在 [=17 中默认给出 1 =]
对于 16:它应该检查 e_uuid
= 15 和最大值 seq_cnt
。这里(执行我的合并语句后)最大值 seq_cnt
是 2 那么 16 的 seq_cnt
将作为 3 和 4.
执行上面给出的合并语句后的输出
+--------+------+--------+---------+
| 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 |
+--------+------+--------+---------+
预期输出:
+--------+------+--------+---------+
| 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
子句更改为在 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,因为它已经是一个整数。这使得 13 和 14 组合在一起 - 相同的逻辑适用于 15 和 16 - 它们的上限除以 2 得到两个值的 8。
这就解释了将它们组合在一起的逻辑(13 是奇数,14 是下一个连续的偶数)。
然后按 e_uuid 对行进行排序,然后按 rowid 进行排序以获得您想要的顺序。
如果您只关心 13、14、15 和 16 e_uuid,您可能希望在 where e_uuid in (13, 14, 15, 16)
的 x 子查询中有一个过滤器,具体取决于是否有table.