weixin_42204630
2021-04-09 08:41
采纳率: 40%
浏览 47

mysql存储过程数据问题处理,游标

MySQL现在遇到这个问题需要写存储过程进行处理,问题场景如下:

对同一张表数据循环更新,如表test,中存在,a,b,c,d,e,f,g,其中a为主键,现阶段a与b数据一致,如果数据量在500,其中c列存在一部分相同数据(如500条去重后可能只有100多条数据),现需要将c字段中相同的字段的b列更新为d列长度最短的那条(d列数据是c+其他字符)记录的a列id主键,如图,红框内容更新为黄框中,用游标写但是逻辑上没搞清楚,在线等

 

  • 点赞
  • 收藏

3条回答 默认 最新

  • weixin_42204630 2021-04-12 08:46
    已采纳

    已经用脚本写出来了,其实不用游标也可以,写的脚本如下

    UPDATE elevator_enterprise_sy_analyse t1 JOIN (SELECT t1.id,t2.ent_extend2 FROM
    (
    SELECT ent_extend2,MIN(ent_extend3) ent_extend3 FROM elevator_enterprise_sy_analyse WHERE ent_extend1=1 GROUP BY ent_extend2
    ) t2
    LEFT JOIN elevator_enterprise_sy_analyse t1 ON t1.ent_extend2=t2.ent_extend2 AND t1.ent_extend3=t2.ent_extend3) 
    t2 ON t1.ent_extend2 = t2.ent_extend2
    SET t1.fk_root_id = t2.id,t1.fk_ent_pid=t2.id WHERE t1.ent_extend1=1 AND t1.fk_root_id=t1.id  ;
    点赞 评论
  • weixin_42204630 2021-04-09 10:06

    我自己写的加了一个对d统计长度为e,c分组,e排序,但结果是编译不过去,表elevator_enterprise_sy_analyse为问题中test,yb_id,yb_fk_root_id,yb_ent_extend2,yb_ent_name,yb_ent_extend3对应问题中a,b,c,d,e,

    BEGIN
    -- 第五步 两条以上的数据根据分组上下级更新id关系
    -- WHILE 循环
    -- 定义变量
       -- 创建 用于接收游标值的变量
        DECLARE cs INT;
        -- 注意 接收游标值为中文时 需要 给变量 指定 字符集为utf8
        DECLARE yb_id,yb_fk_root_id,yb_ent_extend2,yb_ent_name,yb_ent_extend2 VARCHAR(250) CHARACTER SET utf8;
        -- 游标结束的标志
        DECLARE done INT DEFAULT 0;
        -- 声明游标
        DECLARE cur1 CURSOR FOR SELECT yb_id,yb_fk_root_id,yb_ent_extend2,yb_ent_name,yb_ent_extend2,yb_ent_extend3 FROM elevator_enterprise_sy_analyse WHERE ent_extend1=1 ;
        -- DECLARE cur2 CURSOR FOR SELECT COUNT(ent_extend2) FROM elevator_enterprise_sy_analyse WHERE ent_extend1=1 ;
        DECLARE cur3 CURSOR FOR SELECT c_ent_extend2,c_ent_extend3 FROM elevator_enterprise_sy_analyse WHERE  ent_extend1=1 GROUP BY ent_extend2,ent_extend3 ORDER BY ent_extend2,ent_extend3;
      
        -- 指定游标循环结束时的返回值 
        DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;
        -- 打开游标
        OPEN cur1;
        -- OPEN cur2;
        OPEN cur3;
        -- 初始化 变量
        SET total = 0;
        SET cs    = 0;
        -- while 循环
        WHILE done != 1 DO
            FETCH cur1 INTO yb_id,yb_fk_root_id,yb_ent_extend2,yb_ent_name,yb_ent_extend2,yb_ent_extend2,yb_ent_extend3;
            FETCH cur3 INTO c_ent_extend2,c_ent_extend3;
            CASE
              WHEN cur1.yb_ent_extend2=cur3.c_ent_extend2 -- and cur1.yb_ent_extend3=cur3.c_ent_extend3
            
              THEN  cs=cs+1
                  CASE
                  WHEN cs=1 THEN
                  CONTINUE;
                  ELSE 
                  UPDATE  elevator_enterprise_sy_analyse SET fk_root_id=cur1.yb_id,fk_ent_pid=cur1.id,ent_stype='X2P0QTPK5' WHERE cur1.yb_ent_name=ent_name;
                  END;
            WHEN
            cur1.yb_ent_extend2<>cur3.c_ent_extend2
            THEN 
             cs  = 0;
            END;
              IF done != 1 THEN
                 SET total = total + 1;
              END IF;    
        END WHILE;
        
        -- 关闭游标
        CLOSE cur1;
        -- CLOSE cur2;
        CLOSE cur3;
     END
    点赞 评论
  • 有问必答小助手 2021-04-10 16:59

    你好,我是有问必答小助手,非常抱歉,本次您提出的有问必答问题,技术专家团超时未为您做出解答

    本次提问扣除的有问必答次数,将会以问答VIP体验卡(1次有问必答机会、商城购买实体图书享受95折优惠)的形式为您补发到账户。

    ​​​​因为有问必答VIP体验卡有效期仅有1天,您在需要使用的时候【私信】联系我,我会为您补发。

    点赞 评论

相关推荐 更多相似问题