使用ROW_NUMBER()的SQL更新记录

时间:2016-12-09 22:27:13

标签: sql postgresql

我有一张名为' cards'的表,其中有一个名为' position' 如何更新/设置'位置'使用ROW_NUMBER()?

等于每条记录的行号

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

"SELECT *,  ROW_NUMBER() OVER () as position FROM cards"

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

2 个答案:

答案 0 :(得分:12)

我假设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;

我应该注意over ()看起来很奇怪,但Postgres确实允许它。通常会包含order by子句。

答案 1 :(得分:4)

原始问题标有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;

enter image description here

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