现在有一个表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
------解决思路----------------------
这种操作不建议直接修改到表,方法可采用
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.主键