【问题标题】:SQL update records with ROW_NUMBER()使用 ROW_NUMBER() 的 SQL 更新记录
【发布时间】:2021-12-14 15:54:07
【问题描述】:

我有一个名为“卡片”的表格,其中有一列名为“位置” 如何使用 ROW_NUMBER() 更新/设置“位置”以等于每条记录的行号?

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

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

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

【问题讨论】:

  • sqlite 不支持row_Number(),所以这个问题只对 Postgres 有意义。

标签: sql postgresql


【解决方案1】:

让我假设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 子句。

【讨论】:

  • 请注意,这在技术上有效,但发现它可能会根据数据库的大小产生大量临时存储问题。
【解决方案2】:

原始问题被标记为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

【讨论】:

    猜你喜欢
    • 2023-04-11
    • 1970-01-01
    • 2013-04-16
    • 1970-01-01
    • 2022-01-16
    • 1970-01-01
    • 1970-01-01
    • 2019-10-31
    相关资源
    最近更新 更多