0

简化,我有一个主键和一个排序列的表:

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 值的一条。

4

1 回答 1

2
UPDATE p
   SET order = (case when id = 2 then 1 else 2 end)
 WHERE id IN (1,2)

会工作。

于 2013-06-13T15:11:38.890 回答