У меня есть данные в таблице, как показано ниже:
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, поэтому вставьте это в таблицу. Пожалуйста, помогите
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
;
Хм . . . Вы можете сгенерировать недостающие строки, используя 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
кажется очень разумным значением в этих обстоятельствах.
Похожие вопросы
Новые вопросы
sql
Язык структурированных запросов (SQL) - это язык запросов к базам данных. Вопросы должны включать примеры кода, структуру таблицы, примеры данных и тег для используемой реализации СУБД (например, MySQL, PostgreSQL, Oracle, MS SQL Server, IBM DB2 и т. Д.). Если ваш вопрос относится исключительно к конкретной СУБД (использует определенные расширения / функции), используйте вместо этого тег этой СУБД. Ответы на вопросы, помеченные SQL, должны использовать стандарт ISO / IEC SQL.