如何使用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,'>')"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,'>') "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> select addn(100) from dual;ADDN(100)--- 5050