Mysql行值交换

epggiuax  于 2023-03-07  发布在  Mysql
关注(0)|答案(3)|浏览(133)

我想交换2行的值,如下所示

+----+--------+------+-------+
| id | p_name | p_no | ms_no |
+----+--------+------+-------+
|  1 | S_1    |    1 |     1 |
|  2 | S_2    |    2 |     1 |
|  3 | S_3    |    3 |     2 |
|  4 | S_4    |    4 |     2 |
+----+--------+------+-------+

我想将ms_no1交换为2,其中p_no1,3结果应如下所示。

+----+--------+------+-------+
| id | p_name | p_no | ms_no |
+----+--------+------+-------+
|  1 | S_1    |    1 |     2 |
|  2 | S_2    |    2 |     1 |
|  3 | S_3    |    3 |     1 |
|  4 | S_4    |    4 |     2 |
+----+--------+------+-------+

我试过一些方法,但没有成功。

nszi6y05

nszi6y051#

UPDATE tablename t1, tablename t2
SET t1.ms_no = t2.ms_no,
    t2.ms_no = t1.ms_no 
WHERE t1.p_no = 1
  AND t2.p_no = 3

fiddle
在SET子句中,=右侧的所有值都是初始值,而不是在此SET的前几行上计算的值。
而不是用户定义的变量。

6jygbczu

6jygbczu2#

您可以使用where子句查找适当的行(p_no为1或3,ms_no为1或2),并使用case表达式在它们之间进行交换:

UPDATE mytable
SET    ms_no = CASE ms_no WHEN 1 THEN 2 ELSE 1 END
WHERE  ms_no IN (1, 2) AND p_no IN (1, 3)
ggazkfy8

ggazkfy83#

使用更新联接:

UPDATE yourTable t1
INNER JOIN yourTable t2
    ON t1.p_no = 1 AND t2.p_no = 3 OR
       t1.p_no = 3 AND t2.p_no = 1
SET
    ms_no = t2.ms_no;

这种方法使交换的记录与原始表中的每个p_no = 1p_no = 3记录对齐,然后,我们只需要用连接表中的值覆盖ms_no的值。

相关问题