2016-12-27 5 views
0

Я таблицу подкачки с этой структурой (показывающий один пример строки):Обновление нескольких строк с результатом подзапроса

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 

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

ответ

0

Предполагая 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 сохранить строку, если соответствующий жанр не найден. В этом случае вы получите NULL для genre_id. Тот же результат, что и после UPDATE выше.
В зависимости от ваших секретных требований могут быть другие варианты ...

+0

Большое вам спасибо, он отлично работает со вставкой – Dennis

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

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

+0

с обновлением не возможно? – Dennis

+0

Итак, вы хотите обменивать существующую таблицу swap_book вместо того, чтобы создавать новую таблицу книг, которую вы имеете в своем вопросе? – Gautam

Смежные вопросы