mybatis一条sql处理排序问题

插入序号及更新、删除调整序号,保证数值是连续的 实现原理

insert(查询当前主题下的最大值,如果没有就直接添加,如果有,
就比较,如果当前大,直接插入(保证是连续的);如果当前小,就重新进行排序 大于等于的 进行加一 ,为当前腾一个位置
注释:如果:当前条件下的表中有数据 进入 逻辑A, 
            否则 : 设置当前domain的序号为1 ,插入数据(当前domain中的序号不一定是1)
           
            逻辑A:
                1: 获取当前条件下表中的最大的序号 赋给: @ROLRATE
                2: 如果: 表中的最大序号 小于 当前domain中的序号,直接插入到最后一行使序号为     @ROLRATE+1
                              否则: 使表中所有大于等于 当前domain中的序号的记录的序号加 1 ,再插入当前domain.
if (select count(SBJCOD) from XXX where SBJCOD=#sbjcod:char# ) >= 1
begin
    declare @ROLRATE int
    set @ROLRATE =( select max(ROLRATE) from XXX where SBJCOD=#sbjcod:char# )  
    if @ROLRATE <![CDATA[ < ]]>#rolrate:int#
       begin
           insert into XXX (SBJCOD, ROLCOD, ROLNAM ,ROLRATE, ORGLVL,ISRPTGRP) values (#sbjcod:char#, #rolcod:int#, #rolnam:varchar#,@ROLRATE+1,#orglvl:char#,#isrptgrp:char#)
       end
     else
     begin
        update XXX set ROLRATE=ROLRATE+1 where SBJCOD=#sbjcod:char# and ROLRATE >= #rolrate:int#
        insert into XXX (SBJCOD, ROLCOD, ROLNAM ,ROLRATE, ORGLVL,ISRPTGRP) values (#sbjcod:char#, #rolcod:int#, #rolnam:varchar#, #rolrate:int#,#orglvl:char#,#isrptgrp:char#)
     end
end
else
begin
    insert into XXX (SBJCOD, ROLCOD, ROLNAM ,ROLRATE, ORGLVL,ISRPTGRP) values (#sbjcod:char#, #rolcod:int#, #rolnam:varchar#, 1,#orglvl:char#,#isrptgrp:char#)
end   

update
查询当前主题下的最大值
调整,如果从小调整大了。在此区间的进行-1操作
      如果调整小了,在此区间的进行+1操作。
sql注释
            1:获取当前条件下表中的最大的序号 赋给: @ROLRATE
            2:如果:变更后的domain的序号(A) 大于变更前的序号(B),使表中所有小于等于A 且 小于B的记录的序号减1
                   如果:变更后的domain的序号 小于变更前的序号,使表中所有大于等于A 且 小于B的记录的序号加1
                   如果:变更后的domain的序号 等于变更前的序号,不进行操作。
            3:再使@ROLRATE 与 A 进行比较
                   如果 变更后的序号   大于 当前条件下最大序号,设置当前domain序号为@ROLRATE
                    否则  直接插入。
declare @ROLRATE int
set @ROLRATE =( select max(ROLRATE) from XXX where SBJCOD=#sbjcod:char# )

if #rolrate:int# > #tmprolrate:int#
begin
update XXX set ROLRATE=ROLRATE-1 where SBJCOD=#sbjcod:char#  and <![CDATA[ ROLRATE <= #rolrate:int# and ROLRATE > #tmprolrate:int# ]]>
end

if #rolrate:int# <![CDATA[ < ]]>  #tmprolrate:int#
begin
update XXX set ROLRATE=ROLRATE+1 where SBJCOD=#sbjcod:char#  and <![CDATA[ ROLRATE >= #rolrate:int# and ROLRATE < #tmprolrate:int# ]]>
end

//调整过后,再处理当前值和  最大值的关系(保证最大值是连续的**********)
if @ROLRATE <![CDATA[ < ]]>#rolrate:int#
begin
    update XXX set SBJCOD=#sbjcod:char# , ROLCOD=#rolcod:int# , ROLNAM=#rolnam:varchar# , ROLRATE=@ROLRATE  ,ORGLVL=#orglvl:char#,ISRPTGRP=#isrptgrp:char# where SBJCOD=#sbjcod:char# and ROLCOD=#rolcod:int#
end
else
begin
    update XXX set SBJCOD=#sbjcod:char# , ROLCOD=#rolcod:int# , ROLNAM=#rolnam:varchar# , ROLRATE=#rolrate:int# ,ORGLVL=#orglvl:char#,ISRPTGRP=#isrptgrp:char# where SBJCOD=#sbjcod:char# and ROLCOD=#rolcod:int#
end


删除操作
sql 注释
             1: 删除当前domain ,
             2: 更新表中序号大于当前domain序号的记录(CTSQN-1) 
delete from XXX where SBJCOD=#sbjcod:char# and ANLCOD=#anlcod:varchar# and COLCOD=#colcod:varchar# and CFGBSL=#cfgbsl:char#
update XXX set CTSQN=CTSQN-1 where SBJCOD=#sbjcod:char# and ANLCOD=#anlcod:varchar#  and CFGBSL=#cfgbsl:char# and CTSQN > #ctsqn:int#

备注:

1:设置方式   

DECLARE @dim_val_cnt INT
SELECT @dim_val_cnt = COUNT(1) from XX

2:比较

IF (@dim_val_cnt = 0)

begin 

end

else if ()

else if ()

else

猜你喜欢

转载自yuebishuhui-sina-com.iteye.com/blog/2220380