簡単に言うと、主キーと並べ替え列を持つテーブルがあります。
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 では、これは機能しません。
編集明確にするために、入力で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.
つまり、2 つのレコードの順序フィールドを交換します。1 つは によって識別され、given_id
もう 1 つは目的の順序値を持つレコードです。