sql - 使用 ORDER BY 更新

标签 sql postgresql sql-update sql-order-by

需要将 UPDATEORDER BY“绑定(bind)”。我正在尝试使用游标,但出现错误:

cursor "cursupd" doesn't specify a line,
SQL state: 24000

代码:

BEGIN;
    DECLARE cursUpd CURSOR FOR SELECT * FROM "table" WHERE "field" = 5760 AND "sequence" >= 0 AND "sequence" < 9 ORDER BY "sequence" DESC;
    UPDATE "table" SET "sequence" = "sequence" + 2 WHERE CURRENT OF cursUpd;
    CLOSE cursUpd;
COMMIT;

如何正确操作?

更新 1

没有光标,当我这样做时:

UPDATE "CableLinePoint" AS "t"
SET "sequence" = t."sequence" + 2
from (
    select max("sequence") "sequence", "id"
    from "CableLinePoint"
    where
        "CableLine" = 5760
    group by "id"
    ORDER BY "sequence" DESC
) "s"
where "t"."id" = "s"."id" and "t"."sequence" = "s"."sequence"

我得到了独特的错误。所以,需要从最后而不是从头开始更新。

更新 2

表:

id|CableLine|sequence
10|    2    |    1
11|    2    |    2
12|    2    |    3
13|    2    |    4
14|    2    |    5

需要更新(增加)字段“sequence”。 "sequence"有 "index"类型,所以不能这样做:

UPDATE "table" SET "sequence" = "sequence" + 1 WHERE "CableLine" = 2

id = 10 行中的“sequence”增加 1 时,我收到一个错误,另一行 “sequence” = 2 已经存在。

最佳答案

UPDATEORDER BY:

UPDATE thetable 
  SET columntoupdate=yourvalue 
 FROM (SELECT rowid, 'thevalue' AS yourvalue 
         FROM thetable 
        ORDER BY rowid
      ) AS t1 
WHERE thetable.rowid=t1.rowid;

UPDATE 顺序仍然是随机的(我猜),但是提供给 UPDATE 命令的值与 thetable.rowid=t1.rowid 条件。所以我正在做的是,首先选择内存中的“更新”表,它在上面的代码中被命名为 t1,然后使我的物理表看起来与 t1 相同.更新顺序不再重要。

至于真正有序的 UPDATE,我不认为它对任何人都有用。

关于sql - 使用 ORDER BY 更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16735950/

相关文章:

mysql - 如何从三个关联表中获取数据

mysql - 匹配和替换 mysql 查询

sql - 后端是否应该在 SQL 查询之前执行一致性检查?

sql - 检查整个表中的单个值

ios - iOS SQLite3 中 SQLite 更新语句的可能性

sql - Postgres - 通过步骤/分辨率获取两个日期之间的记录

mysql - 设计一个数据库来处理产品变化的库存跟踪

postgresql - 如何在 PostgreSQL 存储过程中使查询成为原子查询?

mysql - 使用连接更新多个表

sql - 根据列的当前值更新列