Сделать запрос на создание определенного количества строк в таблице

У меня есть таблица Продукты (p_id,p_name,p_count) и Екземпляры(e_id(тип данных счетчик), product_id)

У каждого продукта может быть много экземпляров. У разных экземпляров может быть одинаковый product_id, но e_id Всегда разный.

Я хочу сделать запрос, чтобы в Екземпляре строки заполнялись автоматически, если количество экземпляров с product_id меньше, чем p_count.

То есть, если, например p_count = 3, p_id = 1, а экземпляров с таким p_id нет, то сгенерируются следующие строки:

e_id product_code
... ...
5 1
6 1
7 1
... ...

(Работаю в Access)


Ответы (2 шт):

Автор решения: Akina

Вот запрос, который позволит понять, сколько раз надо вставить каждую запись в Екземпляры:

SELECT t1.p_id, t1.p_count needed, COUNT(*) present
FROM Продукты t1
LEFT JOIN Екземпляры t2 ON t1.p_id = t2.product_id
GROUP BY t1.p_id, t1.p_count
HAVING needed > present;

Запрос возвращает для каждого продукта количество записей, как требуемое, так и имеющееся, причём только для тех продуктов, для которых необходимо добавить ещё записей.

А дальше - обрабатывай полученный набор и вставляй.

Альтернативно - просто вставляем каждого продукта по одной записи. После чего снова выполняем запрос. И повторяем, пока после очередной итерации запрос не вернёт пустой набор записей. Ещё разумнее сразу преобразовать этот SELECT в INSERT, и повторять пока количество вставленных записей не станет нулевым.

→ Ссылка
Автор решения: ValNik

Из любопытства попробовал вставить несколько недостающих записей одним запросом

INSERT INTO Examples
SELECT t.p_id 
FROM(
  SELECT p.p_id,p.p_name,p.p_count
    ,(select count(*) from Examples e where e.p_id=p.p_id) as cnt   ,nn.n
  FROM Product as p 
   ,(select top 1 1 as n from Product 
     union select top 1 2 as n from Product
     union select top 1 3 as n from Product 
     union select top 1 4 as n from Product) as nn 
 ) t
where t.n>t.cnt and t.n<=t.p_count
;

В Access работает.

→ Ссылка