如何在SQL中交换和更新行的顺序?

时间:2017-10-17 19:51:16

标签: sql sql-server sql-server-2012 sql-update row

我有一个名为Device的表,现在我需要交换devid 5和devid 6的devid行的顺序。

CurrentTable

PID DEVID  INID EVTYPEID EVID   ALID    PARMID TEXTID  InputName  Input2Name
1   1       0     30      0    100102      0    14     998-TCR1     998-EMG1
1   2       0     30      0    100103      0    15     998-FR       998-TCR2
9   3       0     30      0    100113      0    25     998-TCR2     998-EMG2
0   4       2     30      0    100114      0    26     998-FR        NULL
8   5      18     4      53    100114      0    0      998-Sg op   998-Sg cl
4   6      17     4      53    1000114     0    0       SG_PB       RA_PB

预期结果

PID DEVID  INID EVTYPEID EVID   ALID    PARMID TEXTID  InputName  Input2Name
1   1       0     30      0    100102      0    14     998-TCR1     998-EMG1
1   2       0     30      0    100103      0    15     998-FR       998-TCR2
9   3       0     30      0    100113      0    25     998-TCR2     998-EMG2
0   4       2     30      0    100114      0    26     998-FR        NULL
4   6      17     4      53    1000114     0    0       SG_PB       RA_PB
8   5      18     4      53    100114      0    0      998-Sg op   998-Sg cl
  

我的表中有150列,PID和RID是主键

2 个答案:

答案 0 :(得分:0)

您当前的选择语句加上:

Order by case when DEVID = 6 then 5
when DEVID = 6 then 6
else Devid
end

不是一个漂亮的解决方案,但回答了这个问题。

答案 1 :(得分:0)

您需要使用临时数来切换它们。 更新设备SET DEVID = -6 WHERE DEVID = 6; 更新设备SET DEVID = 6 WHERE DEVID = 5; 更新设备SET DEVID = 5 WHERE DEVID = -6; 如果另一个表与DEVID列具有外键关系,那么它会变得有点棘手。选项: 您可以打破外键关系,进行切换,然后 把钥匙放回去。 您可以使用DEVID = 7创建临时记录(或 不采取其他措施)并在查询中使用7作为占位符 以上(而不是-6)。在这种情况下不要忘记删除你的 你完成后的虚拟记录。