2016-03-01 33 views
0

我试图从rank()像这样更新的结果PostgreSQL的表中的列(pop_1_rank):更新使用PostgreSQL的表列()

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

“SELECT”中没有'FROM'子句。这怎么可能正确地工作? –

+0

@GiorgosBetsos对不起...错过了一些我正在变成“伪代码” – jonmrich

+0

开始你的别名应该在'RANK()OVER()作为rnk'之后不在'WHERE'后面 –

回答

2

我宁愿使用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 
+0

谢谢!这工作完美! – jonmrich

0

您在UPDATE查询中缺少WHERE,因为执行UPDATE ... FROM时,您基本上正在执行连接。

因此,您需要选择主键,然后在主键上进行匹配以更新列正在计算排名。

+0

好吧...有点新对此,你能给我一个小方向吗? – jonmrich

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。