Извините, если это было отреагировано в другом месте, я боюсь, мне нужно немного больше разъяснений/очистки в предложении 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 здесь, где это на самом деле действительный конструкт.
(Из инструкции) [http://www.postgresql.org/docs/current/static/sql-update.html]: «* Обратите внимание, что цель таблица должна ** не ** появляться в списке from_list **, если вы не намерены присоединяться *** " –
yes, но:" (в этом случае оно должно появляться с псевдонимом в from_list) ", который я делать с ** AS s **, если я прав –
Итак, вы *** делаете *** намереваетесь самостоятельно объединить таблицу с собой? Вы не делаете этого в выбранном запросе. –