postgres使用join更新

时间:2015-08-12 10:19:53

标签: sql postgresql

我正在尝试用来自ht的数据更新表tr。两者都有几乎相同的列。 所以为了测试我运行了这个查询。

SELECT * FROM tr a
RIGHT OUTER JOIN ht b
USING (date, name, ft )
WHERE ft IS NOT NULL

给出129行 检查一下,然后我运行了更新查询as->

UPDATE tr
SET (o_t, g_v, br, s_t, st, c_d, n_r, n_a, cd_id) 
    = (a.o_t, a.g_v, a.br, a.s_t, a.st, a.c_d, a.n_r, a.n_a, 
    a.cd_id)
FROM tr a
RIGHT OUTER JOIN ht b
USING (date, name, ft )
WHERE a.ft IS NOT NULL

查询成功返回:受影响的4134行

有些人可以指导我出了什么问题以及如何解决这个问题。

1 个答案:

答案 0 :(得分:0)

这在Postgres中有点复杂。但是,我质疑你的逻辑。似乎right outer join不正确,因为您正在检查第一个表不是NULL。所以这将似乎来捕捉你的逻辑:

UPDATE tr
SET (o_t, g_v, br, s_t, st, c_d, n_r, n_a, cd_id) 
    = (a.o_t, a.g_v, a.br, a.s_t, a.st, a.c_d, a.n_r, a.n_a, 
    a.cd_id)
FROM tr a JOIN
     ht b
     USING (date, name, ft );

where子句甚至是多余的,因为由于NULL条件,该值不能为join。无论如何,这不起作用,但它确实指向了正确的解决方案。

在Postgres中,update中的表格不能在FROM子句中,除非您的意图是自我加入。所以,试试这个版本:

UPDATE tr
SET (o_t, g_v, br, s_t, st, c_d, n_r, n_a, cd_id) 
    = (a.o_t, a.g_v, a.br, a.s_t, a.st, a.c_d, a.n_r, a.n_a, 
    a.cd_id)
FROM tr a JOIN
     ht b
     USING (date, name, ft )
WHERE tr.date = a.date and tr.name = a.name and tr.ft = a.ft;

但是,此更新没有意义。我怀疑,当匹配时,您希望值来自ht NOT tr。如果是这样,这是最简单的方法:

UPDATE tr
    SET (o_t, g_v, br, s_t, st, c_d, n_r, n_a, cd_id) 
        = (a.o_t, a.g_v, a.br, a.s_t, a.st, a.c_d, a.n_r, a.n_a, 
        a.cd_id)
    FROM ht a
    WHERE tr.date = a.date and tr.name = a.name and tr.ft = a.ft;