【问题标题】:postgres update with joinpostgres 更新加入
【发布时间】:2015-08-12 10:19:52
【问题描述】:

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

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

提供 129 行 检查它没问题,然后我运行更新查询 ->

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 行受影响

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

【问题讨论】:

  • 第一个是右外连接,第二个是左外连接。这可能与它有关?
  • 更正了 sql。问题仅在于这个
  • 只粘贴您正在使用的代码会更加健壮,否则您会招致各种看起来像问题但不是问题的拼写错误。
  • 您的查询没有意义。单行匹配,因此值不会改变。您是否打算将值来自b

标签: sql postgresql


【解决方案1】:

这在 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 子句甚至是多余的,因为由于join 条件,值不能是NULL。无论如何,这不起作用,但它确实指向了正确的解决方案。

在 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;

但是,此更新没有意义。我怀疑您希望值来自 htNOT 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;

【讨论】:

    猜你喜欢
    • 2022-01-15
    • 2018-05-01
    • 2016-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-16
    • 2019-07-20
    • 2017-04-03
    相关资源
    最近更新 更多