weixin_44314488 2019-08-24 02:28 采纳率: 0%
浏览 293

怎么样删除单表的级联

图片说明

RT 像这么一张表的级联,这时候我删除广东省的话 ,就要把广东省下面的如广州市,荔湾区,越秀区.....这些全删掉,也包括广东下面其他市和县都要删掉,想了很久、如果只是删他的下级的话、还是很容易的、一条SQL就行、但是如果要删三级呢?同事说用递归、想了很久都不会、也搜索了全网、都没有找到、有大佬知道怎么写吗、谢谢。(当然实际上不是这张表,用这张表只是觉得比较经典,大家一看就明白)

  • 写回答

2条回答 默认 最新

  • 毕小宝 博客专家认证 2019-08-24 09:10
    关注

    下面是一个递归查询某个 area_id 对应的所有子节点的递归函数,它会返回一个数组,然后用 IN 条件来删除,可以试试:

    -- 自定义函数查询子节点
    delimiter $$
    create function `getChildLst`(`rootId` varchar(64)) returns varchar(1000)
    BEGIN
      DECLARE sTemp VARCHAR(1000);
      DECLARE sTempChd VARCHAR(1000);
      SET sTemp = '$';
      SET sTempChd = rootId;
      WHILE sTempChd is not null DO
        SET sTemp = concat(sTemp,',',sTempChd);
        SELECT group_concat(area_id) INTO sTempChd FROM t_area
        where FIND_IN_SET(pid,sTempChd)>0;
      END WHILE;
      RETURN sTemp;
    END
    
    $$
    delimiter ;
    

    说明:这是分组递归查询的函数,参数为当前顶级groupId
    使用: select g2.area_id from t_area g2 where find_in_set(g2.area_ID, getChildLst(#{groupId}));
    该sql可以返回此groupId和以此groupId为根节点的所有结点

    评论

报告相同问题?

悬赏问题

  • ¥15 安卓adb backup备份应用数据失败
  • ¥15 eclipse运行项目时遇到的问题
  • ¥15 关于#c##的问题:最近需要用CAT工具Trados进行一些开发
  • ¥15 南大pa1 小游戏没有界面,并且报了如下错误,尝试过换显卡驱动,但是好像不行
  • ¥15 没有证书,nginx怎么反向代理到只能接受https的公网网站
  • ¥50 成都蓉城足球俱乐部小程序抢票
  • ¥15 yolov7训练自己的数据集
  • ¥15 esp8266与51单片机连接问题(标签-单片机|关键词-串口)(相关搜索:51单片机|单片机|测试代码)
  • ¥15 电力市场出清matlab yalmip kkt 双层优化问题
  • ¥30 ros小车路径规划实现不了,如何解决?(操作系统-ubuntu)