首页 新闻 会员 周边

这个sql应该怎么写

0
悬赏园豆:100 [已解决问题] 解决于 2019-08-12 08:43

id表示位置,连续; NAME为名字
现在要每2个更换位置, 1/2互换;3/4互换;如果最后是单独一个则不动
输出结果为:
ID NAME
1 li
2 wang
3 hu
4 chen
5 zhao

小小xx的主页 小小xx | 初学一级 | 园豆:16
提问于:2019-08-09 14:42
< >
分享
最佳答案
1

-- 以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;

收获园豆:80
yanggb | 菜鸟二级 |园豆:282 | 2019-08-09 15:25

如有帮助请采纳,谢谢

yanggb | 园豆:282 (菜鸟二级) | 2019-08-09 16:26

@杨冠标: 不行啊,报错,我用的是PLSQL Developer

小小xx | 园豆:16 (初学一级) | 2019-08-09 17:22

@杨冠标: 最后的null打错了,加上以后执行也是这样的

小小xx | 园豆:16 (初学一级) | 2019-08-09 17:26

@小小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));

yanggb | 园豆:282 (菜鸟二级) | 2019-08-10 14:28
其他回答(5)
0

最终结果是显示,还是修改

小小咸鱼YwY | 园豆:3210 (老鸟四级) | 2019-08-09 14:49

修改

支持(0) 反对(0) 小小xx | 园豆:16 (初学一级) | 2019-08-09 14:52

大兄弟,给我说一下思路也行啊,sql只会基础的,搞不出来啊

支持(0) 反对(0) 小小xx | 园豆:16 (初学一级) | 2019-08-09 15:13
1

用过程吧,逻辑比较清晰点,按照自己想要的顺序插入到临时表,然后清空现在的表,把临时表插入现在的表。

chengeng | 园豆:294 (菜鸟二级) | 2019-08-09 16:25
1

思路(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数据库
收获园豆:10
小光 | 园豆:1766 (小虾三级) | 2019-08-09 16:27

这个想法不错,有空我试一下 👍

支持(0) 反对(0) 小小xx | 园豆:16 (初学一级) | 2019-08-09 17:23
1

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.程序读出去再处理也可以

收获园豆:10
gw2010 | 园豆:1487 (小虾三级) | 2019-08-09 17:22

这样的话最后一条的id也会变,跟我要的结果不一致啊

支持(0) 反对(0) 小小xx | 园豆:16 (初学一级) | 2019-08-09 17:31

@小小xx: 这个是你增加出来的列,不影响你的直实id。你发现查询的数据对了就可以了啊。现在看来是对的啊。

支持(0) 反对(0) gw2010 | 园豆:1487 (小虾三级) | 2019-08-09 17:32
1

https://www.cnblogs.com/zhiyin1209/p/11171680.html#%E9%A2%98%E7%9B%AE%E4%B8%89%E6%8D%A2%E5%BA%A7%E4%BD%8D%E4%B8%AD%E7%AD%89

可以参考下我之前写的这篇博文,题目三:换座位的实现思路应该可以满足你的需求

知音12138 | 园豆:176 (初学一级) | 2019-08-09 21:08

多谢老哥,的确符合我的需求,但是已经结贴了,只能点一下支持了👍

支持(0) 反对(0) 小小xx | 园豆:16 (初学一级) | 2019-08-12 14:18
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册