Цикличное заполнение отсутствующих записей

Рейтинг: -1Ответов: 1Опубликовано: 13.03.2023

Представим две таблицы с таким набором данных.

Таблица Table_s Характеризует собой вид продукта, мы будем рассматривать яблоко.

CREATE TABLE table_s(
  s_id number,
  s_value varchar(200)
);

INSERT INTO table_s VALUES
(10001, 'Яблоко'),
(10001, 'Огурцы');
S_id s_value
10001 Яблоко
10002 Огурцы

На яблоки есть заказы, она же Table_o, связываются они путем использоваться S_id через fk_s_id таблицы Table_s, тип связи - один s_id ко многим fk_s_id.

CREATE TABLE Table_o(
  order_value varchar(20),
  fk_s_id number
);

INSERT INTO Table_o VALUES
('00/22', 10001),
('11/23', 10001);
order_value fk_s_id
00/22 10001
11/23 10001

На каждый заказ можно задать свое количество яблок, количество можно задать через таблицу Table_C, связь идет по order_value таблицы заказов - table_o, так и с помощью связи с S_id таблицы Table_s, связь типа 1 к 1 в обоих случаях, но вот незадача...

CREATE TABLE Table_C(
  c_id number,
  fk_s_id number,
  fk_order_value varchar(20),
  c_count number
);
--p.s. Сверху уже написал триггер на инсерт для генерации id по секвенции,
-- нет необходимости генерировать ID самостоятельно для данной таблицы
INSERT INTO Table_C VALUES
(null, 10001, 00/22, 25);
c_id fk_s_id fk_order_value c_count
1 10001 00/22 25

Запись количества создана только на 1 заказ.

Следовательно при попытке запроса c_count на заказ 11/23 мы будем получать null.

Необходимо реализовать процедуру, при котором можно будет обнаруживать отсутствующие записи, а после этого insert'ить их с количеством по умолчанию "1"

Желаемый результат после исполнения процедуры

select * from Table_C
c_id fk_s_id fk_order_value c_count
1 10001 00/22 25
2 10001 11/23 1

Ответы

▲ 1Принят
INSERT INTO Table_C( c_id, fk_s_id, fk_order_value, c_count)
SELECT NULL, table_s.s_id, Table_o.order_value, 1
FROM table_s 
JOIN Table_o ON table_s.s_id = Table_o.fk_s_id
LEFT JOIN Table_C ON table_s.s_id = Table_C.fk_s_id 
                 AND Table_o.order_value = Table_C.fk_order_value
WHERE table_s.s_value = 'Яблоко'
  AND Table_C.fk_order_value IS NULL;

https://dbfiddle.uk/JWrEHEkV