道歉,如果这已被其他地方回答,恐怕我需要更多澄清/刷新在PostgreSQL的UPDATE FROM子句。PostgreSQL更新从
基本上,我有一个临时表与一些中间计算的东西,我想用来更新主表。该临时表包含两个外键和一个分数,如:
score fk_offer fk_searchprofile
65 1764 12345
...
我测试了用选择要更新的行(表temp_offerids_with_score
包含需要更新的报价):
SELECT s.pkid, tmp.fk_offer, s.fk_category, tmp.score, tmp.fk_searchprofile
FROM
temp_weighted_scores_offers AS tmp
INNER JOIN sc_sp_o_c_score AS s
ON tmp.fk_offer = s.fk_offer
WHERE
tmp.fk_offer IN (SELECT fk_offer FROM temp_offerids_with_score)
AND
s.fk_category = 1
AND s.fk_searchprofile = 12345;
此正确地返回行的期望数目(在本例10):
pkid fk_offer fk_category score fk_searchprofile
1 47 1 78 12345
2 137 1 64 12345
3 247 1 50 12345
...
然而,如果使用相同的在UPDATE FROM:
UPDATE sc_sp_o_c_score
SET score = tmp.score
FROM
temp_weighted_scores_offers AS tmp
INNER JOIN sc_sp_o_c_score AS s
ON tmp.fk_offer = s.fk_offer
WHERE
tmp.fk_offer IN (SELECT fk_offer FROM temp_offerids_with_score)
AND
s.fk_category = 1
AND s.fk_searchprofile = 12345;
整个表,超过32000行,得到整体更新与相同(错误,当然)分数。
pkid fk_offer fk_searchprofile fk_category score
1 47 12345 1 104
2 137 12345 1 104
3 247 12345 1 104
我错过了什么?
感谢,朱利安
编辑:以防万一这可能是有帮助 - 为了记录在案,我在这里迁移从SQL Server的事情,在这里其实这是一个有效的结构。
(从手动)[http://www.postgresql.org/docs/current/static/sql-update.html]:“*注意目标表必须**不**出现在from_list中,**除非你打算自我加入***“ –
是,但是:”(在这种情况下,它必须在from_list中出现一个别名)“,我是如果我是正确的,请用** AS **来做 –
那么你做***打算将表格与自己的自连接?你不会在选择查询中这样做。 –