0

簡単に言うと、主キーと並べ替え列を持つテーブルがあります。

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 つは目的の順序値を持つレコードです。

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 に答える