2016-12-27 15 views
0

結果に私はこの構造(一例行を示す)とスワップテーブルをしました:別のテーブルgenreにおいて更新複数行サブクエリ

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

私はすべての書籍のジャンルを有します。対応するジャンルのIDを第3のテーブルbookに挿入します。本のタイトルは、このクエリで挿入された:

INSERT INTO book(title) SELECT title FROM swap_book; 

帳テーブルの構造は次のとおりです。

id | title | genre_id 

が、私はこの使用してケトルを行う必要があるとのスワップ表のすべての行のための

答えて

0

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であると仮定しています。以下のようなgenreテーブルを想定し

+0

で更新できません? – Dennis

+0

あなたはあなたの質問にある新しい本の表を作成するのではなく、既存のswap_bookの表をうまく使いたいですか? – Gautam

関連する問題