我有一张名为' cards'的表,其中有一个名为' position' 如何更新/设置'位置'使用ROW_NUMBER()?
等于每条记录的行号我可以使用以下语句查询记录并获取正确的值:
"SELECT *, ROW_NUMBER() OVER () as position FROM cards"
所以,我想这样做,但让它更新数据库中的新值。
答案 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;
完全相同的代码也适用于PostgreSQL: Rextester Demo