2016-12-27 84 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