当前位置: 代码迷 >> Sql Server >> 一个表其间两行的互换
  详细解决方案

一个表其间两行的互换

热度:47   发布时间:2016-04-24 08:57:59.0
一个表之间两行的互换
现在有一个表test ,里面四个字段 ID,A,B,C。里面有两行数据(1,'qwe','asd','zxc'),(2,'rty','fgh','vbn')
现在要的结果是1和2 不变,里面的字段互换 (1,'rty','fgh','vbn'),(2,'qwe','asd','zxc')
如何用简单易懂的SQL做到

create table test(id int,a varchar(50),b varchar(50),c varchar(50) )
values (1,'qwe','asd','zxc'),(2,'rty','fgh','vbn')

 
------解决思路----------------------
--建表
create table T
(
id int,
A Varchar(10),
B Varchar(10),
C Varchar(10)
)

 
--插入测试数据 
insert into t values(1,'qwe1','asd','zxc'),(2,'rty2','fgh','vbn')
,(3,'qwe3','asd','zxc'),(4,'rty4','fgh','vbn')
,(6,'rty6','fgh','vbn'),(8,'rty8','fgh','vbn'),(9,'rty9','fgh','vbn')


--更新(第一行和第二行交换,第三行和第四行交换)
With CT
As
(
select   ROW_NUMBER() over(order by id) As new,*
from t
)
Update CT Set A=B.A,B=B.B,C=B.C
From CT B
Where Case When CT.new%2=1 then 1 else -1 end+CT.new=B.new

--查看结果
Select * From T
 
------解决思路----------------------
引用:
Quote: 引用:

1、说下你这样实现的目的是什么?或许有更简单的方式做到
2、数据两条的话是很简单的,实际情况有没有更加复杂的,一并说说


那我说下复杂情况,现在有一个档案库的表,主键是GUID,字段有工号,所在单位,所在部门,所在岗位,生日,工资,入职日期等字段,现在要实现一个功能,选出任意两个人的(有GUID),要互换两个人的所在单位,所在部门,所在岗位(都是GUID类型),其他不变。 说的清楚么?


这种操作不建议直接修改到表,方法可采用

1、增加表字段 isuse_flag 是否使用(默认为1)、record_id 档案编号ID 、 modify_date 修改日期
2、如果两条数据互换
      首先将互换的两条数据对应的 isuse_flag置为0,表示之后不再采用该条记录
      其次将两者的record_id互换后进行数据插入,issue_flag默认为1,modify_date默认为getdate()
------解决思路----------------------
WITH a AS (
    SELECT 主键,所在单位,所在部门,所在岗位,
           ROW_NUMBER() OVER(ORDER BY 主键) rn
      FROM table1
     WHERE 工号 IN (3,7) -- 任意两个人的工号
)
,b AS (
    SELECT a1.主键,
           a2.所在单位,a2.所在部门,a2.所在岗位
      FROM a a1
      JOIN a a2
        ON a1.rn = (a2.rn % 2 + 1)
)
UPDATE table1
   SET table1.所在单位 = b.所在单位,
       table1.所在部门 = b.所在部门,
       table1.所在岗位 = b.所在岗位
  FROM table1, b
 WHERE table1.主键 = b.主键
  相关解决方案