2015-09-07 59 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

輝煌,謝謝! –