如何根据特定条件将数据合并到目标 table 中。需要按顺序分组,然后必须加载数据
How to MERGE data into the target table based on certain conditions . Need to group by sequence and then have to load the data
CREATE TABLE transact (
seq_id NUMBER(10),
q_id NUMBER(10),
a_val VARCHAR2(20),
ref_pa_id NUMBER(10),
seq NUMBER(10)
);
INSERT INTO transact VALUES(11,13,null,992,1);
INSERT INTO transact VALUES(11,13,null,637,2);
INSERT INTO transact VALUES(11,14,'Manual',null,3);
INSERT INTO transact VALUES(11,15,null,083,1);
上面是 table transact
的数据,我需要将相同的数据加载到另一个 table transact_entry
但有一些条件如下所述:
目标 table :
CREATE TABLE transact_entry (
seq_id NUMBER(10),
ref_id NUMBER(10),
sys_otr VARCHAR2(20),
int_otr VARCHAR2(20)
);
条件:
我需要按照顺序对数据进行分组。在上面的数据中,我们总共有 4 个条目,我们需要从中检查 seq
列并找到唯一的。所以,unique 将以 3 的形式出现,即序列 1,2,3
q_id
是静态的。因此,我们需要根据这些 q_id
即 13,14,15
将记录插入 transact_entry
table
让我们从 seq
1 开始,它有两个 q_id
,即 13 和 15。然后我们需要将这些记录加载到 transact_entry
table .对于 13,我们将 transact
table 的 ref_pa_id
插入目标 table 列 ref_id
,对于 15,我们将插入 a_val
transact
table 进入目标 table transact_entry
列 int_otr
现在让我们检查 seq
2. 如果 q_id
是 13 那么我们将插入 transact
table 的 ref_pa_id
进入目标 table transact_entry
列 ref_id
现在让我们检查 seq
3. 如果 q_id
是 14 那么我们将插入 transact
table 的 a_val
进入目标 table transact_entry
列 sys_otr
预期输出:
+--------+--------+---------+---------+
| seq_id | ref_id | sys_otr | int_otr |
+--------+--------+---------+---------+
| 11 | 992 | | null |
| 11 | 637 | | |
| 11 | | Manual | |
+--------+--------+---------+---------+
使用的工具:SQL Developer(18c)
看起来你想要一个条件聚合,有点像
select seq_id,
max(case q_id when 13 then ref_pa_id end) refid,
max(case q_id when 15 then a_val end) int_otr,
max(case q_id when 14 then a_val end) sys_otr
from transact
group by seq_id, seq
order by seq_id, seq
declare
type t_v_seq is table of transact.seq%type INDEX BY BINARY_INTEGER;
v_seq t_v_seq;
type t_v_trans is table of transact%rowtype INDEX BY BINARY_INTEGER;
v_trans t_v_trans;
begin
select DISTINCT seq bulk collect into v_seq from transact;
if v_seq.count >0 then
for i in v_seq.first..v_seq.last loop
if v_seq.exists(i) then
select * bulk collect into v_trans from transact where seq=v_seq(i);
if v_trans.count>0 then
for r in v_trans.first..v_trans.last loop
if v_trans.exists(r) then
if v_trans(r).q_id = 13 then
insert into transact_entry (seq_id,ref_id,sys_otr,int_otr)
values (v_trans(r).seq_id , v_trans(r).ref_pa_id,v_trans(r).a_val,null);
elsif v_trans(r).q_id = 14 then
insert into transact_entry (seq_id,ref_id,sys_otr,int_otr)
values (v_trans(r).seq_id ,null,v_trans(r).a_val,null);
elsif v_trans(r).q_id = 15 then
insert into transact_entry (seq_id,ref_id,sys_otr,int_otr)
values (v_trans(r).seq_id ,null,null,v_trans(r).a_val);
end if;
end if;
end loop;
end if;
end if;
end loop;
end if;
delete from transact_entry where ref_id is null and sys_otr is null and int_otr is null;
end;
CREATE TABLE transact (
seq_id NUMBER(10),
q_id NUMBER(10),
a_val VARCHAR2(20),
ref_pa_id NUMBER(10),
seq NUMBER(10)
);
INSERT INTO transact VALUES(11,13,null,992,1);
INSERT INTO transact VALUES(11,13,null,637,2);
INSERT INTO transact VALUES(11,14,'Manual',null,3);
INSERT INTO transact VALUES(11,15,null,083,1);
上面是 table transact
的数据,我需要将相同的数据加载到另一个 table transact_entry
但有一些条件如下所述:
目标 table :
CREATE TABLE transact_entry (
seq_id NUMBER(10),
ref_id NUMBER(10),
sys_otr VARCHAR2(20),
int_otr VARCHAR2(20)
);
条件:
我需要按照顺序对数据进行分组。在上面的数据中,我们总共有 4 个条目,我们需要从中检查
seq
列并找到唯一的。所以,unique 将以 3 的形式出现,即序列 1,2,3
将记录插入q_id
是静态的。因此,我们需要根据这些q_id
即 13,14,15transact_entry
table让我们从
seq
1 开始,它有两个q_id
,即 13 和 15。然后我们需要将这些记录加载到transact_entry
table .对于 13,我们将transact
table 的ref_pa_id
插入目标 table 列ref_id
,对于 15,我们将插入a_val
transact
table 进入目标 tabletransact_entry
列int_otr
现在让我们检查
seq
2. 如果q_id
是 13 那么我们将插入transact
table 的ref_pa_id
进入目标 tabletransact_entry
列ref_id
现在让我们检查
seq
3. 如果q_id
是 14 那么我们将插入transact
table 的a_val
进入目标 tabletransact_entry
列sys_otr
预期输出:
+--------+--------+---------+---------+
| seq_id | ref_id | sys_otr | int_otr |
+--------+--------+---------+---------+
| 11 | 992 | | null |
| 11 | 637 | | |
| 11 | | Manual | |
+--------+--------+---------+---------+
使用的工具:SQL Developer(18c)
看起来你想要一个条件聚合,有点像
select seq_id,
max(case q_id when 13 then ref_pa_id end) refid,
max(case q_id when 15 then a_val end) int_otr,
max(case q_id when 14 then a_val end) sys_otr
from transact
group by seq_id, seq
order by seq_id, seq
declare
type t_v_seq is table of transact.seq%type INDEX BY BINARY_INTEGER;
v_seq t_v_seq;
type t_v_trans is table of transact%rowtype INDEX BY BINARY_INTEGER;
v_trans t_v_trans;
begin
select DISTINCT seq bulk collect into v_seq from transact;
if v_seq.count >0 then
for i in v_seq.first..v_seq.last loop
if v_seq.exists(i) then
select * bulk collect into v_trans from transact where seq=v_seq(i);
if v_trans.count>0 then
for r in v_trans.first..v_trans.last loop
if v_trans.exists(r) then
if v_trans(r).q_id = 13 then
insert into transact_entry (seq_id,ref_id,sys_otr,int_otr)
values (v_trans(r).seq_id , v_trans(r).ref_pa_id,v_trans(r).a_val,null);
elsif v_trans(r).q_id = 14 then
insert into transact_entry (seq_id,ref_id,sys_otr,int_otr)
values (v_trans(r).seq_id ,null,v_trans(r).a_val,null);
elsif v_trans(r).q_id = 15 then
insert into transact_entry (seq_id,ref_id,sys_otr,int_otr)
values (v_trans(r).seq_id ,null,null,v_trans(r).a_val);
end if;
end if;
end loop;
end if;
end if;
end loop;
end if;
delete from transact_entry where ref_id is null and sys_otr is null and int_otr is null;
end;