Как добавить запись в таблицу одним запросом?

Есть таблицы.

books (BookID, Title)
tags (TagID, TagName)

Хочу сделать связанную таблицу для указания тегов относящихся к книге:

BookTags (BookId, TagId)

Тогда записи в этой таблице будут вида:

1 | 2
1 | 3
2 | 3 

и т.д.

Как добавить запись, если я знаю BookID и имя тега TagName?

Первое, что пришло в голову это сделать подзапрос внутри insert для получения TagID. Но это невозможно сделать для одного значения, либо для всех вставляемых, либо никак.

Как вариант, перед вставкой делать запрос на TagID, но может быть можно сделать вставку одним запросом?


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

Автор решения: Alex R.

Записи в таблицу можно вставлять путем получения данных из другого запроса. Для вашей задачи это будет выглядеть так:

insert into BookTags(
  BookTagsId, BookId, TagId)
select
  seq_BookTags.nextval, t.TagID, :BookId
from Tags t
where t.TagName = :TagName

Я добавил в таблицу первичный ключ (лучше чтобы он был, но удалите если не требуется).

Через параметры :BookId, :TagName передаю id книги и имя тега.

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

Если известны наименование книги и тега, то:

INSERT INTO BookTags (BookId, TagId)
SELECT Books.BookID, Tags.TagId
FROM Books, Tags
WHERE Books.Title = @BookTitle
  AND Tags.TagName = @TagName;
→ Ссылка
Автор решения: 0xdb

Полностью рабочий и воспроизводимый пример:

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.

→ Ссылка