Обновить несколько строк с результатом подзапроса

У меня есть таблица подкачки с этой структурой (показывая один пример строки):

title       | author_firstname | author_lastname | genre
------------+------------------+-----------------+-----------
the promise | robert           | crails          | thriller

В другой таблице genreу меня все книжные жанры. Я хочу вставить идентификатор соответствующего жанра в третью таблицу book. Заголовок книги был вставлен с этим запросом:

INSERT INTO book(title) SELECT title FROM swap_book;

Структура таблицы книги:

id | title | genre_id

Мне нужно сделать это с помощью чайника и для каждой строки в таблице подкачки

2 ответа

  1. INSERT INTO book(title, genre_id) 
    select title, genre.id 
    from swap_book 
      inner join swap_book.genre=genre.genrename
    

    Я предполагаю, что имя жанра в таблице жанров-genrename.

  2. Предполагая genreтаблицу как:

    CREATE TABLE genre(genre_id serial PRIMARY KEY, genre text UNIQUE NOT NULL);
    

    Вы можете сделать UPDATE:

    UPDATE book b
    SET    genre_id = g.genre_id
    FROM   swap_book s
    JOIN   genre g ON g.genre = s.genre
    WHERE  b.title = s.title;
    

    Это требуетtitle, чтобы быть уникальным в обеих таблицах.

    Очевидно, что лучше сделать это все в одном INSERTвместо:

    INSERT INTO book (title, genre_id)
    SELECT s.title, g.genre_id
    FROM   swap_book s
    LEFT   JOIN genre g ON g.genre = s.genre;
    

    Я использую LEFT JOINдля сохранения строки, если не найден соответствующий жанр. genre_idВ этом случае вы получаете NULL for. Тот же результат, что и после UPDATEвышесказанного.
    В зависимости от ваших секретных требований могут быть и другие варианты …