行号为()的SQL更新记录
我有一张名为“cards”的表,其中有一列名为“position” 如何使用row_number()更新/设置“position”以使每个记录的行号相等 我可以使用以下语句查询记录并获得正确的值:行号为()的SQL更新记录,sql,postgresql,Sql,Postgresql,我有一张名为“cards”的表,其中有一列名为“position” 如何使用row_number()更新/设置“position”以使每个记录的行号相等 我可以使用以下语句查询记录并获得正确的值: "SELECT *, ROW_NUMBER() OVER () as position FROM cards" 因此,我想这样做,但让它更新数据库中的新值。让我假设卡有一个主键。然后您可以使用加入: update cards c set position = c2.seqnum f
"SELECT *, ROW_NUMBER() OVER () as position FROM cards"
因此,我想这样做,但让它更新数据库中的新值。让我假设
卡有一个主键。然后您可以使用加入:
update cards c
set position = c2.seqnum
from (select c2.*, row_number() over () as seqnum
from cards c2
) c2
where c2.pkid = c.pkid;
我应该注意到,over()
看起来很奇怪,但Postgres确实允许这样做。通常情况下,会包含一个
按
排序的子句。原始问题被标记为。
从SQLite 3.25.0开始,我们可以在本地使用
同样的代码也适用于PostgreSQL:sqlite不支持行号()
,因此这个问题只对Postgres有意义。
CREATE TABLE cards(pk INT PRIMARY KEY, c VARCHAR(2), seq INT);
INSERT INTO cards(pk, c) VALUES (10,'2♥'),(20,'3♥'),(30, '4♥');
WITH cte AS (SELECT *, ROW_NUMBER() OVER() AS rn FROM cards)
UPDATE cards SET seq = (SELECT rn FROM cte WHERE cte.pk = cards.pk);
SELECT * FROM cards;