使用子查询的结果更新多行

时间:2016-12-27 15:53:11

标签: sql postgresql sql-update

我有一个具有这种结构的交换表(显示一个示例行):

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

我需要使用Kettle和交换表中的每一行

来完成此操作

2 个答案:

答案 0 :(得分:0)

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

我假设流派表中的流派名称是genrename。

答案 1 :(得分: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来保留行。在这种情况下,genre_id为NULL。与上面UPDATE之后的结果相同 根据您的秘密要求,可能还有其他选择......