У меня есть данные в таблице, как показано ниже:

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 вторичные записи ..

Я хочу вставить недостающую запись в таблицу. Например, для ex serial_id 200 отсутствуют данные для первичного ID 28, поэтому вставьте это в таблицу. Пожалуйста, помогите

0
user2862073 16 Фев 2021 в 12:00

2 ответа

Лучший ответ

Вы можете использовать что-то вроде этого. В 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
;
0
MDO 16 Фев 2021 в 13:44

Хм . . . Вы можете сгенерировать недостающие строки, используя cross join, а затем что-то вроде left join или not exists:

select sp.serial_id, sp.primary_id, sp.secondary_id
from (select d.serial_id, d.primary_id
      from data d
     ) sp join
     (select d.serial_id, d.secondary_id
      from data d
     ) ss
     on sp.serial_id = ss.serial_id left join
     data d
     on d.serial_id = sp.serial_id and
        d.primary_id = sp.primary_id and
        d.secondary_id = sp.secondary_id 
where d.serial_id is null;

Затем вы можете вставить результаты этого запроса в свою таблицу.

В вашем вопросе не указано, какое значение queue_id следует использовать. NULL кажется очень разумным значением в этих обстоятельствах.

0
Gordon Linoff 16 Фев 2021 в 12:42
66221356