首页 > 解决方案 > 在表 oracle 中插入缺失的行

问题描述

我在下表中有数据:

Primary_id  Serial_ID   PRIMARY_ID  SECONDARY_ID    queue_ID
1   100 58  89  Q1428291
2   100 58  89  Q1428281
3   100 58  89  Q1428293
4   100 89  58  Q1428293
5   100 89  58  Q1428291
6   100 89  58  Q1428000281
7   200 16  28  Q1433144
8   200 16  28  Q1431953
9   200 16  28  Q1432397
10  200 16  28  Q1431921
11  200 28  16  Q1433144
12  200 28  16  Q1432397
13  200 28  16  Q1431921

我们有 primary_ID 和 Secondary_ID 列。对于 serial_ID 100,我们有 3 个主要记录和 3 个辅助记录..如果您看到数据 Primary_ID 变为辅助,辅助变为主要(每个 3 个)。但是对于 serial_id 200,我们有 4 个主要记录但 3 个辅助记录..

我想在表中插入缺失的记录。例如,serial_id 200 缺少主 ID 28 的数据,因此将其插入表中。请协助

标签: sqloracle

解决方案


你可以使用这样的东西。在 temp_table 中,我将行分为两种不同的类型(“P”或“S”)。

我假设 queue_id = 'Q1428000281' (从第 6 行开始)是一个错误,它应该是 'Q1428281'。

drop table table_test ;
create table table_test (id, serial_id, primary_id, secondary_id, queue_id) as (
select 1 ,  100, 58,  89,  'Q1428291'       from dual union all
select 2 ,  100, 58,  89,  'Q1428281'       from dual union all
select 3 ,  100, 58,  89,  'Q1428293'       from dual union all
select 4 ,  100, 89,  58,  'Q1428293'       from dual union all
select 5 ,  100, 89,  58,  'Q1428291'       from dual union all
select 6 ,  100, 89,  58,  'Q1428000281'    from dual union all
select 7 ,  200, 16,  28,  'Q1433144'       from dual union all
select 8 ,  200, 16,  28,  'Q1431953'       from dual union all
select 9 ,  200, 16,  28,  'Q1432397'       from dual union all
select 10,  200, 16,  28,  'Q1431921'       from dual union all
select 11,  200, 28,  16,  'Q1433144'       from dual union all
select 12,  200, 28,  16,  'Q1432397'       from dual union all
select 13,  200, 28,  16,  'Q1431921'       from dual
)
;

insert into table_test (id, serial_id, primary_id, secondary_id, queue_id)
with temp_table as (
select t.*
    , case when primary_id < secondary_id then 'P' else 'S' end type_t
from table_test t
)
select v_max.id_max + rownum ID, SERIAL_ID, PRIMARY_ID, SECONDARY_ID, queue_id
from (
  select SERIAL_ID
    , max(SECONDARY_ID) PRIMARY_ID
    , min(PRIMARY_ID) SECONDARY_ID
    , max(queue_id)queue_id
    , count(TYPE_T) cnt
  from temp_table tp
  group by SERIAL_ID
    , least(PRIMARY_ID, SECONDARY_ID)
    , greatest(PRIMARY_ID, SECONDARY_ID)
    , QUEUE_ID
  having count(TYPE_T) != 2
)t 
cross join (select max(id) id_max from table_test) v_max
;

推荐阅读