我正在尝试使用pop_1_rank
的结果更新postgresql表中的列(rank()
),如下所示:
UPDATE database_final_form_merge
SET
pop_1_rank = r.rnk
FROM (
SELECT pop_1, RANK() OVER ( ORDER BY pop_1 DESC) FROM database_final_form_merge WHERE territory_name != 'north' AS rnk)r
SELECT
查询本身工作正常,但我无法让它正确更新。我在这里做错了什么?
答案 0 :(得分:4)
我更喜欢使用CTE表示法。
WITH cte as (
SELECT pop_1,
RANK() OVER ( ORDER BY pop_1 DESC) AS rnk
FROM database_final_form_merge
WHERE territory_name <> 'north'
)
UPDATE database_final_form_merge
SET pop_1_rank = cte.rnk
FROM cte
WHERE database_final_form_merge.pop_1 = cte.pop_1
答案 1 :(得分:0)
您在UPDATE查询中缺少WHERE,因为在执行UPDATE时...来自您基本上正在进行联接。
因此,您需要选择主键,然后匹配主键以更新仅计算排名的列。
答案 2 :(得分:0)
据我所知,Postgres更新了表而不是子查询。所以,您可以join
回到表格:
UPDATE database_final_form_merge
SET pop_1_rank = r.rnk
FROM (SELECT pop_1, RANK() OVER ( ORDER BY pop_1 DESC) as rnk
FROM database_final_form_merge
WHERE territory_name <> 'north'
) r
WHERE database_final_form_merge.pop_1 = r.pop_1;
另外:
pop_1
是连接两个表的id。