简化,我有一个主键和一个排序列的表:
TABLE P
----------
id order
1 1
2 2
3 3
假设我想将 id 为 2 的记录“向上移动”,即交换该记录与 order 1 的记录之间的 order 值,从而得到:
TABLE P
----------
id order
1 2
2 1
3 3
在MySQL中,我曾经这样做:
UPDATE
P AS P1,
P AS P2
WHERE
P1.id = some_id
AND P2.order = P1.order -1;
在 Oracle 中,这不起作用。
编辑为了澄清,在输入中给出一个id(given_id),我想要:
SELECT order INTO :oldorder FROM P WHERE id=given_id;
UPDATE P SET order=order+1 WHERE id=given_id;
UPDATE P SET order=order-1 WHERE order=:oldorder.
也就是说,将 order 字段交换为两条记录,一条由 the 标识,given_id
另一条是具有目标 order 值的一条。