Сделать запрос на создание определенного количества строк в таблице
У меня есть таблица Продукты (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 шт):
Вот запрос, который позволит понять, сколько раз надо вставить каждую запись в Екземпляры:
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, и повторять пока количество вставленных записей не станет нулевым.
Из любопытства попробовал вставить несколько недостающих записей одним запросом
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 работает.