2015-09-07 62 views
1

道歉,如果这已被其他地方回答,恐怕我需要更多澄清/刷新在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的事情,在这里其实这是一个有效的结构。

+1

(从手动)[http://www.postgresql.org/docs/current/static/sql-update.html]:“*注意目标表必须**不**出现在from_list中,**除非你打算自我加入***“ –

+0

是,但是:”(在这种情况下,它必须在from_list中出现一个别名)“,我是如果我是正确的,请用** AS **来做 –

+0

那么你做***打算将表格与自己的自连接?你不会在选择查询中这样做。 –

回答

2

您正在使用该表进行更新,并将其作为自联接进行更新(通过FROM子句中的引用)。采取这一出,你应该是不错的:

UPDATE sc_sp_o_c_score 
    SET score = tmp.score 
    FROM temp_weighted_scores_offers AS tmp 
    WHERE tmp.fk_offer = fk_offer 
    AND tmp.fk_offer IN (SELECT fk_offer FROM temp_offerids_with_score) 
    AND fk_category = 1 
    AND fk_searchprofile = 12345; 
+0

辉煌,谢谢! –