Как добавить запись в таблицу одним запросом?
Есть таблицы.
books (BookID, Title)
tags (TagID, TagName)
Хочу сделать связанную таблицу для указания тегов относящихся к книге:
BookTags (BookId, TagId)
Тогда записи в этой таблице будут вида:
1 | 2
1 | 3
2 | 3
и т.д.
Как добавить запись, если я знаю BookID и имя тега TagName?
Первое, что пришло в голову это сделать подзапрос внутри insert для получения TagID.
Но это невозможно сделать для одного значения, либо для всех вставляемых, либо никак.
Как вариант, перед вставкой делать запрос на TagID, но может быть можно сделать вставку одним запросом?
Ответы (3 шт):
Записи в таблицу можно вставлять путем получения данных из другого запроса. Для вашей задачи это будет выглядеть так:
insert into BookTags(
BookTagsId, BookId, TagId)
select
seq_BookTags.nextval, t.TagID, :BookId
from Tags t
where t.TagName = :TagName
Я добавил в таблицу первичный ключ (лучше чтобы он был, но удалите если не требуется).
Через параметры :BookId, :TagName передаю id книги и имя тега.
Если известны наименование книги и тега, то:
INSERT INTO BookTags (BookId, TagId)
SELECT Books.BookID, Tags.TagId
FROM Books, Tags
WHERE Books.Title = @BookTitle
AND Tags.TagName = @TagName;
Полностью рабочий и воспроизводимый пример:
var BookId number
var TagName varchar2 (100)
exec :BookId:=1; :TagName:='роман';
insert into BookTags
select :BookId, tags.id TagId
from tags
where tags.name=:TagName;
select * from BookTags;
BOOKID TAGID
---------- ----------
1 2
BookId и TagName - это подстановочными переменные в инструменте или приложении.
Тестовые данные для примера на db<>fiddle.