行号为()的SQL更新记录

行号为()的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

我有一张名为“cards”的表,其中有一列名为“position” 如何使用row_number()更新/设置“position”以使每个记录的行号相等

我可以使用以下语句查询记录并获得正确的值:

"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;