Цикличное заполнение отсутствующих записей
Представим две таблицы с таким набором данных.
Таблица 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;