问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501
你好,欢迎来到懂视!登录注册
当前位置: 首页 - 正文

如何使用sql语句建立一个存储过程来实现如下递归功能?

发布网友 发布时间:2022-05-02 14:38

我来回答

3个回答

懂视网 时间:2022-05-02 18:59

目录

  • 记一次SqlServer骚操作——递归
  • 创建一个测试表,并灌入一些数据
  • 兼容MSSQL2008以下的版本
  • 正向查找
  • 反向查找
  • MSSQL2008以后的版本
  • 正向查找
  • 反向查找
  • 记一次SqlServer骚操作——递归

    ? 最进需要用到sql递归更新数据的问题,因为需要兼容Sql Server 2000的语法,所以在Sql Server2008前后有两种不同的写法,这里简单记录一下。

    创建一个测试表,并灌入一些数据

    CREATE TABLE Test
    (
     Id INT,
     PId int
    )
    
    INSERT INTO Test VALUES(1,null)
    INSERT INTO Test VALUES(2,1)
    INSERT INTO Test VALUES(3,2)
    INSERT INTO Test VALUES(4,3)
    -- 1<<2<<3<<4

    兼容MSSQL2008以下的版本

    正向查找

    --首先我们将需要递归查到的元素写入#temp临时表
    SELECT Id INTO #temp FROM Test WHERE Id=1
    WHILE @@ROWCOUNT > 0
    BEGIN
    --查找子后写入临时表,并排除已经在临时表中的Id
     INSERT INTO #temp SELECT Id FROM Test WHERE PId IN (SELECT Id FROM #temp) AND Id NOT IN (SELECT Id FROM #temp)
    END
    SELECT * FROM #temp

    反向查找

    SELECT Id,PId INTO #temp FROM Test WHERE Id=4
    WHILE @@ROWCOUNT > 0
    BEGIN 
     INSERT INTO #temp SELECT Id,PId FROM Test WHERE Id IN (SELECT PId FROM #temp) AND Id NOT IN (SELECT Id FROM #temp)
    END
    SELECT * FROM #temp 

    MSSQL2008以后的版本

    正向查找

    WITH #temp AS
    (
    --首先我们将需要递归查到的元素写入#temp临时表 
     SELECT Id FROM Test WHERE Id=1
     UNION ALL
    --查找子后写入临时表,并排除已经在临时表中的Id
     SELECT a.Id FROM Test a
     INNER JOIN #temp b ON a.PId= b.Id
    )
    SELECT * FROM #temp

    反向查找

    WITH #temp AS
    (
     SELECT Id,PId FROM Test WHERE Id=4
     UNION ALL
     SELECT a.Id,a.Pid FROM Test a
     INNER JOIN #temp b ON a.Id= b.PId
    )
    SELECT * FROM #temp

    记一次SqlServer骚操作——递归

    标签:sql   HERE   测试   目录   sqlserver   创建   while   递归   问题   

    热心网友 时间:2022-05-02 16:07

    这个是递归加载树,我原来做是用两个过程来实现的,不知道能不能达到你的要求,如果要,给个邮箱,我发给你。追问需要,280502078@qq.com,十分感谢~大哥,还能发么……

    热心网友 时间:2022-05-02 17:25

    查看 sqlserver2005以上的帮助文件,关键字 OUTER APPLY
    其中有个递归 使用 with 实现的。
    ms-help://MS.SQLCC.v10/MS.SQLSVR.v10.zh-CHS/s10de_1devconc/html/0208b259-7129-4d9f-9204-8445a8119116.htm

    自己试试把。
    MySQL递归查询上下级菜单

    现在,我们想要根据输入的`uid`,展示该`uid`及其所有下级单位的`uid`。通常,我们可以通过代码或常用的存储过程实现此功能,但本文将使用SQL语句来解决。核心SQL语句如下:执行结果如下,传入`uid`为1后,列出了所有下级单位,包括第三级菜单。关键点在于使用了`GROUP_CONCAT()`函数,它在分组查询中将同...

    如何实现SQL语句的递归查询

    1.创建测试表,createtabletest_connect(idnumber,p_idnumber);2.插入测试数据,Insertintotest_connectvalues(1,1);Insertintotest_connectvalues(2,1);Insertintotest_connectvalues(3,2);Insertintotest_connectvalues(4,3);提交;3.查询数据表的内容,选择*fromtest_connect...

    sql语句实现递归查询所有节点,mysql和oracle都能用的

    如果是从子节点递归到父节点查询,就把start with 换成unid,prior左右对换 下面再讲MySql 的递归查询方式。MySql没有Oracle的强大功能,虽然都是同一个公司的产品。所以只能靠自己写。有很多方法,用sql去循环查询,或者写存储过程,我这里只提供一种。就是新建一个function函数。表结构不说了,无非就是...

    sql 知道父节点,查询所有的子节点,运用游标,递归,存储过程

    里面记录的值是不是和BMWHS 对应的,所以只能说个大概。select sys_connect_by_path(username,'&gt;')"Path"from tmbm start with id=1 connect by prior id=parentid;其中,id是你要遍历的起始点,比如你想从 厂号=XX 的这个父节点开始寻找他所有的子节点,这里就换成 start with BMWHS=XX 然...

    Mysql实现数据排序上移下移操作详解mysql上移下移

    存储过程是指预先定义好的一系列SQL语句,以便在需要执行时调用。存储过程有以下优点:可以避免注入攻击、提高数据访问效率等。如果需要频繁执行上移和下移操作,可以使用存储过程实现。下面我们来介绍如何用存储过程实现数据上移和下移。1.创建存储过程 我们需要创建一个名为moveRecord的存储过程,该存储过程...

    sql 知道父节点,查询所有的子节点,运用游标,递归,存储过程

    select sys_connect_by_path(username,'&gt;') "Path"from tmbm start with id=1 connect by prior id=parentid;其中,id是你要遍历的起始点,比如你想从 厂号=XX 的这个父节点开始寻找他所有的子节点,这里就换成 start with BMWHS=XX 然后,connect by prior id=parentid,这里id=parentid,...

    MySQL无法实现递归操作mysql不支持递归

    1. 递归查询语句中的NULL值处理和数据类型转换的支持;2. 递归查询语句中的尾递归优化。这两个组件都是实现递归操作的核心部分。在MySQL中,尝试使用递归查询语句时,会产生“ERROR 1953 (HY000): Recursive limit 256 (as set by the max_sp_recursion_depth variable) was exceeded”,这是因为MySQL...

    sql server 递归查询

    LastName FROM dbo.Employees WHERE EmployeeID = 5 UNION ALL SELECT EMP.EmployeeID, EMP.ReportsTo, EMP.FirstName, EMP.LastName FROM EmpsCTE AS MGR JOIN dbo.Employees AS EMP ON EMP.ReportsTo = MGR.EmployeeID )SELECT * FROM EmpsCTE;这就是一个使用CTE的一个查询,你看一下吧 ...

    我想在db2中写个函数,函数中使用递归(with)生成一个字符串后附给一个...

    我想在db2中写个函数,函数中使用递归(with)生成一个字符串后附给一个变量,已供以后使用 5 用set赋值时报错,但是直接return就可以。哪位大侠能给我说说递归语句生成的值,怎么在存储过程或者函数中使用,谢了!没人理我啊... 用set赋值时报错,但是直接return就可以。哪位大侠能给我说说递归语句生成的值,怎么在...

    oracle中使用sql递归算出1加到100的值

    --自己调用自己才是递归 create or replace function addn(n number)return number is begin if n=1 then return 1;else return n+addn(n-1);end if;end;/ SQL&gt; select addn(100) from dual;ADDN(100)--- 5050

    声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。
    E-MAIL:11247931@qq.com
    空间向量的坐标运算与平面坐标的运算的区别? 想要一个英文名。。。要好听好读的 最好字数少的说 请帮我取一个独特的英文名 推荐一些个性点的英文名!不要太普通的 个人配送液化气怎么售卖 iphone手机上的三国杀,能在安卓手机上充值元宝吗?求高手解答。_百度知 ... 延边大学护理学院师资队伍如何? ...打克重100多克的杯子(透明塑料AS),用什么类型的注塑机(各种指标值... 延边大学护理系怎么样 卖液化气要什么手 手机内存卡放到哪个手机都可以用吗 手机内存卡怎么使用 用手机里面的内存卡怎么才能用 描写秋天的诗句佳句 描写秋天的佳句 关于秋天的佳句 形容秋天的名言名句 支付宝开始可以记录走步步数,为什么突然不可以记录步数不变了? 手机安卓怎么不计步数为什么软件以后还会更新吗 六月份学车微信建群起个什么名字好呢(注一个女的,三个男的) 微信添加你但是你忘了加,显示已过期,怎样才能加回来,或者查看他的,就是这种情况? 从出身贫穷后经过奋斗有所成就的例子 穷人奋斗事迹 穷人通过奋斗成功的故事 OPPO手机微信聊天记录 周公解梦梦到鸡蛋打碎出现很小的鸡仔 梦见自己捡掉在地上破了壳的鸡蛋,而且里面有要付出来的小鸡仔? 有没有可以测试网络稳定程度的软件? 网络软件测试工具有哪些值得推荐? 求测试有线网络稳定的软件 微信怎么设置隐藏,不让好友看到? 不想让别人看见自己的怎么办? 怎么隐藏 怎样关闭显示在群聊里的 怎样在群里不显示 怎么隐藏,让好友看不到自己的 如何才能让自己的在微信群里不显示啊? vivo手机微信怎么隐藏自己的? 微信怎么隐藏不让好友看到 微信怎么隐藏不让好友看到 怎样在微信群里设置让别人看不到自己的? 怎么隐藏别人看不见 微信怎么隐藏不让别人看见我的? 苹果手机群牙印里怎么样隐藏自己的 怎样把自己的隐藏起来 怎么把隐藏 微信怎么设置隐藏自己的,别人看不到? 微信群怎么隐藏 微信群怎么隐藏 你好 我微信朋友圈的相片都加载不出来是为什么 网络是好使的
    • 焦点

    最新推荐

    猜你喜欢

    热门推荐