如何翻转两行的值?

How to flip values of two rows?

ID  TYPE      ORDER_INDEX  CITY_ID
-----------------------------------
1   CAT            1          1
2   DOG            2          1
3   CAT            4          2 
4   DOG            5          2
5   BEE            9          1

对于每个城市,我需要交换 catdogorder_index

所以 ID 为 1 的城市应该有 cat=2 和 dog=1,ID 为 2 的城市应该有 cat=5 和 dog=4。

纯SQL如何做到这一点?

使用更新:

UPDATE yourTable t1
SET ORDER_INDEX = (SELECT t2.ORDER_INDEX FROM yourTable t2
                   WHERE t2.CITY_ID = t1.CITY_ID AND
                         t2.TYPE IN ('CAT', 'DOG') AND
                         t2.TYPE <> T1.TYPE)
WHERE TYPE IN ('CAT', 'DOG');

以上更新逻辑假定您希望在具有相同 CITY_ID.

的 dog/cat 对记录之间进行 ORDER_INDEX 交换

好吧,如果您不关心 ID,那么有一个简单的选项可以满足您的需求:

之前:

SQL> select * from test order by id;

        ID TYP ORDER_INDEX    CITY_ID
---------- --- ----------- ----------
         1 CAT           1          1
         2 DOG           2          1
         3 CAT           4          2
         4 DOG           5          2
         5 BEE           9          1

更新:

SQL> update test set
  2    type = decode(type, 'DOG', 'CAT', 'DOG')
  3  where type in ('CAT', 'DOG');

4 rows updated.

之后;要求是

city with ID 1 should have cat=2 and dog=1, city with ID 2 would have cat=5 and dog=4.

SQL> select * from test order by id;

        ID TYP ORDER_INDEX    CITY_ID
---------- --- ----------- ----------
         1 DOG           1          1  --> city with ID = 1 has DOG = 1 ...
         2 CAT           2          1  --> ... and CAT = 2
         3 DOG           4          2  --> city with ID = 2 has DOG = 4 ...
         4 CAT           5          2  --> ... and CAT = 5
         5 BEE           9          1

SQL>