2016-12-27 82 views
0

的結果我有一個交換表,這種結構(出一例行):更新多行與子查詢

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

在另一臺genre我把所有的書流派。我想在第三個表book中插入相應流派的ID。書名插入與此查詢:

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