2015-09-07 2 views
1

Извините, если это было отреагировано в другом месте, я боюсь, мне нужно немного больше разъяснений/очистки в предложении UPDATE FROM в PostgreSQL.PostgreSQL UPDATE FROM

В основном у меня есть временная таблица с некоторыми промежуточными вычисляемыми материалами, которые я хочу использовать для обновления основной таблицы. Эта временная таблица включает в себя два внешних ключей и счет, такие как:

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 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 

Что мне не хватает?

Спасибо, Джулиан

EDIT: только в случае, если это может быть какой-либо помощи - для записи, я мигрирующие вещи из SQL Server здесь, где это на самом деле действительный конструкт.

+1

(Из инструкции) [http://www.postgresql.org/docs/current/static/sql-update.html]: «* Обратите внимание, что цель таблица должна ** не ** появляться в списке from_list **, если вы не намерены присоединяться *** " –

+0

yes, но:" (в этом случае оно должно появляться с псевдонимом в from_list) ", который я делать с ** AS s **, если я прав –

+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

блестящий, спасибо! –

 Смежные вопросы

  • Нет связанных вопросов^_^