PostgreSQL 更新自
PostgreSQL UPDATE FROM
很抱歉,如果这个问题已经在其他地方得到解答,恐怕我需要更多 clarification/brushing PostgreSQL.
中的 UPDATE FROM 子句
基本上我有一个临时 table,其中包含一些我想用来更新主要 table 的中间计算内容。这个临时table包括两个外键和一个分数,比如:
score fk_offer fk_searchprofile
65 1764 12345
...
我用 select 测试了要更新的行(table 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;
这正确 returns 预期的行数(在本例中为 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;
整个 table,超过 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 服务器迁移内容,这实际上是一个有效的结构。
您正在使用 table 作为自连接进行更新(通过 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;
很抱歉,如果这个问题已经在其他地方得到解答,恐怕我需要更多 clarification/brushing PostgreSQL.
中的 UPDATE FROM 子句基本上我有一个临时 table,其中包含一些我想用来更新主要 table 的中间计算内容。这个临时table包括两个外键和一个分数,比如:
score fk_offer fk_searchprofile
65 1764 12345
...
我用 select 测试了要更新的行(table 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;
这正确 returns 预期的行数(在本例中为 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;
整个 table,超过 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 服务器迁移内容,这实际上是一个有效的结构。
您正在使用 table 作为自连接进行更新(通过 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;