SQL根据Join Model更新所有字段

时间:2015-09-25 19:53:57

标签: sql postgresql

我在Postgres有两张桌子:

Sources [id, term, type]
Posts   [id, source_id, message, term, type]

我正在对这些数据进行反规范化,因此我在每个帖子中添加了术语和类型列,并删除了Sources表。

有没有办法做一个FAST查询,用每个相应的源数据更新帖子(大约有800万个帖子)。

类似的东西:

UPDATE posts
JOIN sources
ON posts.source_id = sources.id
SET post.term = sources.term,
    posts.term_type = sources.term_type;

但这对我来说是一个语法错误。

2 个答案:

答案 0 :(得分:2)

Postgres中的正确语法是:

UPDATE posts
    SET posts.source = sources.source,
        post.term = sources.term,
        posts.term_type = sources.term_type
    FROM sources
    WHERE posts.source_id = sources.id;

或者,您可以使用行构造函数:

UPDATE posts
    SET (source, term, term_type) = (select s.source, s.term, s.term_type
                                     from source s
                                     where posts.source_id = s.id
                                    );

答案 1 :(得分:1)

在postgres中,每次更新都包含一个def inf_repeat(N): return chain.from_iterable(repeat(i, N) for i in count(1)) 和一个insert。因此,如果索引处于活动状态,那么除了双重工作之外也会产生影响。

如果你想要更新整个表,通常要快得多,只需用新值创建表

delete

然后使用CREATE TABLE post2 AS SELECT p.id, p.source_id, p.message, s.term, s.term_type. FROM posts p INNER JOIN source s ON p.source_id = s.id; 重命名ALTER并创建正确的索引。