-- 以SQL Server为例,假设表名为diosos
-- 更新,两两交换,不成对不交换
update d1 set d1.name = d2.name
from diosos d1
left join diosos d2
on (d1.id%2 = 0 and d1.id = (d2.id + 1)) or (d1.id%2 = 1 and d1.id = (d2.id - 1))
where d2.name is not null;
如有帮助请采纳,谢谢
@杨冠标: 不行啊,报错,我用的是PLSQL Developer
@杨冠标: 最后的null打错了,加上以后执行也是这样的
@小小xx: 问问题要问清楚呀,什么数据库要说清楚,不同的数据库语法是不相同的。
Oracle的写法:
-- 以Oracle为例,假设表名为diosos
-- 更新,两两交换,不成对不交换
update diosos d1 set d1.name = (
select d2.name
from diosos d2
where (mod(d1.id, 2) = 0 and d1.id = (d2.id + 1))
or (mod(d1.id, 2) = 1 and d1.id = (d2.id - 1))
) where exists(select d3.id from diosos d3 where d3.id = (d1.id + 1));
最终结果是显示,还是修改
修改
大兄弟,给我说一下思路也行啊,sql只会基础的,搞不出来啊
用过程吧,逻辑比较清晰点,按照自己想要的顺序插入到临时表,然后清空现在的表,把临时表插入现在的表。
思路(java代码写个思路,你可以用java代码写逻辑把sql分开,也可以写一个存储过程):
用第三个变量进行中转:
List<String> lists = new ArrayList<>();//数据库数据
for(int i = 0;i<lists.size()/2;i++){
int hang = i*2;//第几条数据
String name = lists.get(hang);//获取到每两条数据的第一条数据的name,避免给第一条数据赋值是name被覆盖
lists.set(hang, lists.get(hang+1));//更改每两条数据的第一条的name
lists.set(hang+1, name);//更改每两条数据的第二条数据的name
}
//最后update数据库
这个想法不错,有空我试一下 👍
oracle不是很清楚
1.如果id连续,就好办了。 select case when id%2=0 then id-1 else id+1 end as id ,* from [tb] order by 1 -- 把id改变一下来排序。增加一列嘛。
2.如果不连续,可以增加一个自增的 select rn=row_number() over(order by id),*from tb --这个是mssql的
3.程序读出去再处理也可以
这样的话最后一条的id也会变,跟我要的结果不一致啊
@小小xx: 这个是你增加出来的列,不影响你的直实id。你发现查询的数据对了就可以了啊。现在看来是对的啊。
可以参考下我之前写的这篇博文,题目三:换座位的实现思路应该可以满足你的需求
多谢老哥,的确符合我的需求,但是已经结贴了,只能点一下支持了👍