使用ROW_NUMBER()的SQL更新记录

Joh*_*cco 9 sql postgresql

我有一个名为'cards'的表,其中有一个名为'position'的列如何使用ROW_NUMBER()更新/设置'position'以等于每个记录的行号?

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

"SELECT *,  ROW_NUMBER() OVER () as position FROM cards"
Run Code Online (Sandbox Code Playgroud)

所以,我想这样做,但让它更新数据库中的新值.

Gor*_*off 17

我假设cards有一个主键.然后你可以使用join:

update cards c
    set position = c2.seqnum
    from (select c2.*, row_number() over () as seqnum
          from cards c2
         ) c2
    where c2.pkid = c.pkid;
Run Code Online (Sandbox Code Playgroud)

我应该注意over ()看起来很奇怪,但Postgres确实允许它.通常order by会包括一个条款.


Luk*_*zda 8

原始问题被标记为SQLite。从SQLite 3.25.0开始,我们可以在本地使用ROW_NUMBER.

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;
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

完全相同的代码也适用于 PostgreSQL:Rextester Demo