![](/img/trans.png)
[英]How can I log changes like “ALTER table […] ADD column” to my PostgreSQL table?
[英]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.