信息排序问题,或者oracle是否有现成的函数可以排序,详情请看描述,多谢

一碗粉条 发布于 2013/01/09 14:53
阅读 157
收藏 0

信息原排序如下:

title    sort

A        1

B        2

C        3

D        4

E        5

F        6

现在想把F移动到B的前面,也就是变成A-F-B,但是排序不变还是1-2-3(也就是F占用了B原来的排序,B后移),现在问题就是一旦移动,那么从B开始它们的排序都要上升(不能简单用+1),而要获取下级的排序(比如:B就要获取C的原排序3赋值给自己,依次类推),这应该怎么做?请兄弟姐妹们给与开发思想或oracle是否有现成的方法可以使用...多谢

以下是问题补充:

@一碗粉条:每条信息都有各自不重复的主键ID,在排序的时候,B和F的主键ID都可以获取到,这条忘记说明了,见谅。。嘿嘿 (2013/01/09 15:34)
加载中
0
梁小刚
梁小刚

没太理解你的意思,请你把你想要的结果粘出来,这样会容易理解一点。

----v.1-----我把答案改一下。

我建的测试表是:liangxiaogang_test 内容如下:

titile order

a      21
b      31
c      42
d      55
e      67
f      89

现在你要交换e和b的位置,你要取得e的顺序值是67,b的顺序值是31

SQL语句是:

SELECT t1.tile,
      
       (CASE
         WHEN t1.sort = 67 THEN
          31
         WHEN t1.sort >= 31 AND t1.sort < 67 THEN
          t1.next_sort
         ELSE
          t1.sort
       END) AS new_sort,
        t1.sort
  FROM (SELECT t.tile, t.sort, lead(t.sort) over(ORDER BY t.tile) next_sort
          FROM liangxiaogang_test t) t1
 ORDER BY new_sort;

查询结果是:第二列应该是你要的值了。

tile new_sort sort
a    21          21
e    31          67
b    42          31
c    55          42
d    67          55
f    89          89

这里你可以前这个写成函数将b的主键值31,e的主键值67,然后就31和67替换成参数,传进去就可以通用了。

-----------v.2--------------------------------------------------------------------------

依据你的要求:最终的update语句

UPDATE liangxiaogang_test p
   SET p.sort =
       (SELECT tt.new_sort
          FROM (SELECT t1.tile,
                       (CASE
                         WHEN t1.sort = 67 THEN
                          31
                         WHEN t1.sort >= 31 AND t1.sort < 67 THEN
                          t1.next_sort
                         ELSE
                          t1.sort
                       END) AS new_sort,
                       t1.sort
                  FROM (SELECT t.tile,
                               t.sort,
                               lead(t.sort) over(ORDER BY t.tile) next_sort
                          FROM liangxiaogang_test t) t1
                 ORDER BY new_sort) tt
         WHERE tt.new_sort <> p.sort
           AND tt.tile = p.tile)

这次你再不给评最佳答案,我就疯了。

一碗粉条
一碗粉条
回复 @梁小刚 : 筒子,辛苦了。。。据说可行
梁小刚
梁小刚
回复 @孤影飞翔 : 好,我帮你试一下。
一碗粉条
一碗粉条
回复 @梁小刚 : 每条信息都有自己的不重复的主键ID,排序的时候可以获取到B的主键ID和F的主键ID
梁小刚
梁小刚
回复 @孤影飞翔 : 那你也有个条件让F取到B吧,你的条件是什么?
一碗粉条
一碗粉条
排序后 title:A,F,B,C,D,E,F sort:21,31,42,55,67,89 也就是F占据B的sort,B开始不断往后移动,但是不是单纯的+1,-1,而是B获取C的排序赋值给自己,以此类推
下一页
0
dedenj
dedenj

update xx set sort=sort+1 where sort>=2

update xx set sort=2 where title='f';


一碗粉条
一碗粉条
不是单纯的+1,-1,而是B要获取C的sort排序,赋值给自己,依次类推
0
黄龍
黄龍

lag 函数~自己看

黄龍
黄龍
回复 @孤影飞翔 : 现在上班啊~下班又没有oracle测试~- -! 你用临时表吧
一碗粉条
一碗粉条
可否写一个大概的语句呢?非常感谢啊。。。
黄龍
黄龍
@孤影飞翔 搞张临时表咯~update应该也可以的~
一碗粉条
一碗粉条
应该说是lead,查询的时候确实可以查询出我要的效果,可是update的时候应该怎么写?感觉好像update不进去啊。。
0
一碗粉条
一碗粉条

引用来自“梁小刚”的答案

没太理解你的意思,请你把你想要的结果粘出来,这样会容易理解一点。

---------我把答案改一下。

我建的测试表是:liangxiaogang_test 内容如下:

titile order

a      21
b      31
c      42
d      55
e      67
f      89

现在你要交换e和b的位置,你要取得e的顺序值是67,b的顺序值是31

SQL语句是:

SELECT t1.tile,
      
       (CASE
         WHEN t1.sort = 67 THEN
          31
         WHEN t1.sort >= 31 AND t1.sort < 67 THEN
          t1.next_sort
         ELSE
          t1.sort
       END) AS new_sort,
        t1.sort
  FROM (SELECT t.tile, t.sort, lead(t.sort) over(ORDER BY t.tile) next_sort
          FROM liangxiaogang_test t) t1
 ORDER BY new_sort;

查询结果是:第二列应该是你要的值了。

tile new_sort sort
a    21          21
e    31          67
b    42          31
c    55          42
d    67          55
f    89          89

这里你可以前这个写成函数将b的主键值31,e的主键值67,然后就31和67替换成参数,传进去就可以通用了。

梁小刚
梁小刚
回复 @孤影飞翔 : 看我的第一条贴子,取后面。
一碗粉条
一碗粉条
回复 @梁小刚 : 啊,抱歉,抱歉,没有看完全,确实是俺要的结果,那update语句怎么写呢?这个刚刚按你的查询语句思路写了下,没写出来。。
梁小刚
梁小刚
回复 @孤影飞翔 : 我是将e插入到b的位置的。
梁小刚
梁小刚
回复 @孤影飞翔 : 你再仔细看我的结果,是下调的,里面取了lead了。
一碗粉条
一碗粉条
这是需要的结果,不是两个值互调,而是可以理解为将F插入到A和B中间,B后面的值排序全部下调,就是要lead函数那样的效果
返回顶部
顶部