如何根据特定条件将数据合并到目标 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)
);

条件:

  1. 我需要按照顺序对数据进行分组。在上面的数据中,我们总共有 4 个条目,我们需要从中检查 seq 列并找到唯一的。所以,unique 将以 3 的形式出现,即序列 1,2,3

  2. q_id 是静态的。因此,我们需要根据这些 q_id 即 13,14,15

    将记录插入 transact_entry table
  3. 让我们从 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_entryint_otr

  4. 现在让我们检查 seq 2. 如果 q_id 是 13 那么我们将插入 transact table 的 ref_pa_id进入目标 table transact_entryref_id

  5. 现在让我们检查 seq 3. 如果 q_id 是 14 那么我们将插入 transact table 的 a_val进入目标 table transact_entrysys_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;