根据订单列在Oracle中交换两条记录

时间:2013-06-13 14:58:53

标签: mysql sql oracle

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

TABLE P
----------
id   order
1    1
2    2
3    3

假设我想“向上移动”id为2的记录,即将该记录与记录之间的订单值交换为1,以便得到:

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中,这不起作用。

EDIT 为了澄清,在输入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.

即,交换两个记录的订单字段,一个由given_id标识,另一个是具有目标订单值的记录。

1 个答案:

答案 0 :(得分:2)

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

会奏效。