我正在尝试用来自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行
有些人可以指导我出了什么问题以及如何解决这个问题。
答案 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;