在Postgres中,这有点复杂。但是,我质疑你的逻辑。似乎a
right outerjoin是不正确的,因为您正在检查第一个表不是
NULL。因此,这 似乎 可以捕获您的逻辑:
UPDATe trSET (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 trSET (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而 不是
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;



