繁体   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