sql - 在表 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 的数据,因此将其插入表中。请协助
解决方案
你可以使用这样的东西。在 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
;
推荐阅读
- python - 如何创建交易数据的 Jaccard 距离矩阵?
- c++ - pybind11联合失败'is_base_of'断言
- python - 从python中的列表中删除元素
- python - I am trying to make a ARC diagram using python but I am not able to get the height uniform
- spring - Mongo DB连接没有关闭,同时使用反应弹簧启动无限流
- spring-boot - 弹簧靴。如何保护某些页面而不是所有页面
- python - Word count sorting in MapReduce Python using yarn comparator
- javascript - Greensock - DrawSVG
- c# - 将 Json 反序列化为数组类型属性
- javascript - TypeError: Cannot read property 'minify' of undefined in Nuxt.js