我有一个名为'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
会包括一个条款.
原始问题被标记为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
归档时间: |
|
查看次数: |
9924 次 |
最近记录: |