2016-03-01 36 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。