簡體   English   中英

PostgreSQL:如何通過將所選行的列設置為遞增整數來更改表?

[英]PostgreSQL: how can I Alter table by setting a column of the selected rows to be increasing integers?

我有這個名為issue的表,有數千行:

ID 地位 列表位置
43 新的 0
44 新的 0
45 新的 0
46 公認 0
51 公認 1
54 公認 0
66 加工 0
68 加工 0

我想 select 所有status為特定值的行,如New ,並更新listPosition值,使它們處於遞增索引中,如 1、2、3、...。

結果應該是這樣的:

ID 地位 列表位置
43 新的 1
44 新的 2
45 新的 3
46 公認 1
51 公認 2
54 公認 3
66 加工 1
68 加工 2

我怎么能在 PostgreSql 中做到這一點?

我試過了:

UPDATE issue SET listPosition= 'dummy.listPosition'
FROM  
(
  SELECT id, row_number() over (partition by status order by id) AS "listPosition" FROM issue
) AS dummy
WHERE issue.id= 'dummy.id';

它給出了這個錯誤:

ERROR:  invalid input syntax for type integer: "dummy.id"
LINE 6: WHERE issue.id= 'dummy.id';

它是如何失敗的?

我都試過了:(不用擔心dstOrgId的事情)


UPDATE issue SET listPosition= "dummy.listPosition"
FROM  
(
  SELECT id, row_number() over (partition by "dstOrgId", status order by id) AS "listPosition" FROM issue order by id
) AS dummy
WHERE issue.id = dummy.id;



WITH dummy AS
(
  SELECT id, row_number() over (partition by "dstOrgId", status order by id) AS "listPosition" FROM issue order by id
) 
UPDATE issue set listPosition = "dummy.listPosition"
FROM dummy
WHERE issue.id = dummy.id; 

他們都給出了錯誤:

ERROR:  column "dummy.listPosition" does not exist
LINE 5: UPDATE issue set listPosition = "dummy.listPosition"

為什么它在地球上不存在??? PostgreSQL 語法太奇怪了,因為它要求我將set listPosition = dummy.listPosition更改為set listPosition = "dummy.listPosition" ,並抱怨該列不存在。

什么????


我終於通過反復試驗得到了工作命令:

UPDATE issue SET "listPosition"= dummy."listPosition"
FROM  
(
  SELECT id, row_number() over (partition by "dstOrgId", status order by id) AS "listPosition" FROM issue order by id
) AS dummy
WHERE issue.id = dummy.id;

無論如何,雙引號的意義以及PostgreSQL中的單引號和雙引號之間的區別是什么?

您可以通過使用row_number來實現。

select   id
        ,status
        ,row_number() over (partition by status order by id) as listPosition
from     t 
order by id, status
ID 地位 列表位置
43 新的 1
44 新的 2
45 新的 3
46 公認 1
51 公認 2
54 公認 3
66 加工 1
68 加工 2

小提琴

我終於通過反復試驗得到了工作命令:

UPDATE issue SET "listPosition"= dummy."listPosition"
FROM  
(
  SELECT id, row_number() over (partition by "dstOrgId", status order by id) AS "listPosition" FROM issue order by id
) AS dummy
WHERE issue.id = dummy.id;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM