简化,我有一个包含主键和排序列的表:
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
标识,另一个是具有目标订单值的记录。
答案 0 :(得分:2)
UPDATE p
SET order = (case when id = 2 then 1 else 2 end)
WHERE id IN (1,2)
会奏效。