当前位置:首页 » 编程语言 » sql递归函数

sql递归函数

发布时间: 2022-06-10 17:24:45

‘壹’ sql语句中怎么实现递归查询

在SQL
SERVER
2000
中你可以先一些自定义函数,或一些存储过程,实现递归:
select
level,TypeName
from
ProctType
t
START
WITH
t.ParentID=0
CONNECT
BY
PRIOR
t.ProctTypeID=
t.ParentID;

‘贰’ SQL怎么也写成递归形式

函数或过程才可以递归。

例如:

/*--=============================================
--Author: Yew
--Createdate:2016-10-26
--Description: 计算阶乘

--testCode-------------
SELECTuf_Factorial(-1)
SELECTuf_Factorial(0)
SELECTuf_Factorial(1)
SELECTuf_Factorial(10)
SELECTuf_Factorial(20)--会否溢出?

----History-----------------
--=============================================*/
CREATEFUNCTION[dbo].[uf_Factorial](
@N INT
)RETURNSBIGINT
AS
BEGIN
IF@N<0
RETURNNULL--RAISERROR(N'参数N不能为负')

IF@N=0
RETURN1

RETURNdbo.uf_Facctorial(@N-1)*@N--递归
END

‘叁’ SQL 函数递归

给你一个例子,跟这个差不多:
CREATE TABLE T(ID INT ,PID INT)
INSERT INTO T SELECT 1,0
UNION ALL SELECT 2,0
UNION ALL SELECT 3,1
UNION ALL SELECT 4,1
UNION ALL SELECT 5,2
UNION ALL SELECT 6,4
UNION ALL SELECT 7,3
UNION ALL SELECT 8,4
GO
--测试数据

CREATE FUNCTION F(@ID INT)
RETURNS VARCHAR(20)
AS
BEGIN
DECLARE @R VARCHAR(20)
SET @R=@ID
WHILE ISNULL(@ID,'')<>''
BEGIN
SELECT @R=CAST(PID AS VARCHAR(20))+'.'+@R FROM T WHERE ID=@ID
SELECT @ID=PID FROM T WHERE ID=@ID
END
RETURN @R
END
GO
--生成目录

CREATE FUNCTION F2(@F VARCHAR(20))
RETURNS VARCHAR(20)
BEGIN
DECLARE @R VARCHAR(20)
SET @R=''
SET @F=SUBSTRING(@F,4,LEN(@F))
WHILE CHARINDEX('.',@F,1)<>0
BEGIN
SET @F=SUBSTRING(@F,CHARINDEX('.',@F,1)+1,LEN(@F))
SET @R='-'+@R
END
RETURN @R
END
GO
--生成前缀符号

SELECT DBO.F2(DBO.F(ID))+CAST(ID AS VARCHAR) FROM T ORDER BY DBO.F(ID)
GO

--结果

DROP TABLE T
DROP FUNCTION F
DROP FUNCTION F2

----------------------------------------------------以下为结果集--------------------------------------------------------------

1
-3
--7
-4
--6
--8
2
-5

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

首先说一下Oracle的递归查询,相信大部分人都知道很简单。无非start with connect by 函数。下面是从pId向子节点递归查询的例子,unId是数据库表中的主键。

如果是从子节点递归到父节点查询,就把start with 换成unid,prior左右对换

下面再讲MySql 的递归查询方式。MySql没有Oracle的强大功能,虽然都是同一个公司的产品。所以只能靠自己写。有很多方法,用sql去循环查询,或者写存储过程,我这里只提供一种。就是新建一个function函数。

表结构不说了,无非就是 Id ,pId,其他列。下面是创建一个递归查询子节点的函数

DROP FUNCTION IF EXISTS queryChildrenPowerInfo;

CREATE FUNCTION `queryChildrenPowerInfo` (powerId VARCHAR(2000))

RETURNS VARCHAR(2000)

BEGIN

DECLARE sTemp VARCHAR(2000);

DECLARE sTempChd VARCHAR(2000);

SET sTemp = '$';

SET sTempChd = cast(powerId as CHAR);

WHILE sTempChd is not NULL DO

SET sTemp = CONCAT(sTemp, ',', sTempChd);

SELECT group_concat(id) INTO sTempChd FROM t_discretionary_power where FIND_IN_SET(pId,sTempChd)>0;

END WHILE;

return sTemp;

调用的时候:select queryChildrenPowerInfo(""); 该语句会返回Id和父Id等于传入参数powerId的一个字符串,中间有逗号隔开如图

下面这句代码的意思是,查询出 t_discretionary_power 表中,t.id 等于上面查询出的结果集的数据。FIND_IN_SET(A,B)是MYSQL的函数。意思是查找在B集合中有A的数据。相当于In

select t.* from t_discretionary_power t where FIND_IN_SET(t.id,queryChildrenPowerInfo(''))

‘伍’ SQL怎么用递归函数取到最上层的数据

execproc_getDepartment'A'
GO

ALTERPROCEDUREproc_getDepartment
@departmentnvarchar(20)
AS
BEGIN
DECLARE@upDepartmentnvarchar(20)
SELECTTOP(1)@upDepartment=a.上级部门FROMTBASa
WHEREa.部门=@department

IFEXISTS(SELECT1FROMTBASa
WHEREa.部门=@upDepartment)
BEGIN
execproc_getDepartment@upDepartment
RETURN
END

PRINT@upDepartment
END
GO

‘陆’ SQL递归查询知多少

sql 递归查询的方法:
方法一:T-SQL递归查询
with Dep as
(
select Id,DeptCode,DeptName from Department where Id=1
union all
select d.Id,d.DeptCode,d.DeptName from Dep
inner join Department d on dep.Id = d.ParentDeptId
)
select * from Dep
方法二:PL/SQL递归查询
select Id,DeptCode,DeptName
from Department
start with Id = 1
connect by prior Id = ParentDeptId;

‘柒’ SQL递归获取所有父节点的函数

*************

函数如下,请根据你自己的实际情况,把汉字换成相应的具体信息

*************

CREATEFUNCTION函数名(@idASvarchar(2))RETURNSvarchar(1000)AS

BEGIN

DECLARE@tmpVARCHAR(1000)

IF@idISNOTNULL

BEGIN

SELECT@tmp=@id+','+isnull(dbo.函数名(第三列字段),'')FROM[表名]WHERE[第一列字段]=@id

RETURN@tmp

***********

调用方法:

***********

SELECTsubstring(dbo.函数名('15'),1,len(dbo.函数名('15'))-1)

**********

给你个我测试的截图,参考

**********

---

以上,希望对你有所帮助。

‘捌’ SQL函数怎么实现递归

declare @b nvarchar(2) =1;
with abc(id,b_PriorID,level)as
(
select id,b_PriorID,0 level from #tt where b_PriorID =@b
union all
select a.id,a.b_PriorID,t.level+1 from #tt a
inner join abc t
on t.id=a.b_PriorID
)
select * from abc
你试试可以么?

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

1.创建测试表,createtabletest_connect(idnumber,p_idnumber);

‘拾’ sql 怎么递归查询的方法:

1.创建测试表,createtabletest_connect(idnumber,p_idnumber);

热点内容
全名k歌安卓手机里面怎么录屏 发布:2024-05-17 14:40:07 浏览:180
常用数据库介绍 发布:2024-05-17 14:31:38 浏览:504
中孚存储介质信息消除工具 发布:2024-05-17 14:31:33 浏览:588
服务器访问ip如何调转主页 发布:2024-05-17 14:30:33 浏览:788
好玩的解压化妆小游戏 发布:2024-05-17 14:10:57 浏览:127
交通银行怎么登陆不了密码 发布:2024-05-17 13:54:48 浏览:543
安卓如何自动连接无线 发布:2024-05-17 13:53:51 浏览:262
python的urlparse 发布:2024-05-17 13:44:20 浏览:769
linux命令全称 发布:2024-05-17 12:07:54 浏览:110
ftpnas区别 发布:2024-05-17 12:06:18 浏览:949