需要将 UPDATE
与 ORDER 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
已经存在。
最佳答案
UPDATE
和 ORDER 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/