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

sql递归

发布时间: 2022-01-08 01:49:17

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

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

‘贰’ 递归SQL语句


CREATETABLE#test(
Achar(1),
Bchar(1)
)
GO

INSERTINTO#testVALUES('a','b');
INSERTINTO#testVALUES('b','c');
INSERTINTO#testVALUES('c','d');
INSERTINTO#testVALUES('d','e');
INSERTINTO#testVALUES('e','f');
INSERTINTO#testVALUES('a','g');
INSERTINTO#testVALUES('a','h');
INSERTINTO#testVALUES('g','m');
INSERTINTO#testVALUES('m','n');
GO


WithmyCTEAS
(
SELECT
0ASLevel,A,B
FROM
#test
WHERE
B='e'
UNIONALL
SELECT
myCTE.Level+1ASLevel,
t.A,t.B
FROM
#testtJOINmyCTEON(myCTE.A=t.B)
)
SELECTtop1
AAS[最高父节点]
FROM
myCTE
ORDERBY
LevelDESC
GO

最高父节点
-----
a

(1行受影响)

WithmyCTEAS
(
SELECT
0ASLevel,A,B
FROM
#test
WHERE
B='e'
UNIONALL
SELECT
myCTE.Level+1ASLevel,
t.A,t.B
FROM
#testtJOINmyCTEON(myCTE.B=t.A)
)
SELECTtop1
BAS[最下面子节点]
FROM
myCTE
ORDERBY
LevelDESC
GO


最下面子节点
------
f

(1行受影响)



SQL Server 2008 Express 版本下测试通过。

‘叁’ 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递归查询知多少

例如Id 部门内码,
DeptCode 部门编码,
ParentDeptId 上级部门内码
使用PL/SQL:
select Id,DeptCode,DeptName
from Department
start with Id = 1
connect by prior Id = ParentDeptId;
start with 表示从哪一行记录开始递归查询,即根节点 connect by 表示进行递归,后面跟递归条件 prior 表示前一条记录,表示上一条记录的Id = 下一条记录的ParentDeptId 比如上面的SQL语句就可以理解为,以Id 为1的记录为根节点,递归查询下一条记录的ParentDeptId = 前一条记录的Id

‘伍’ SQL递归(高分,急).

这个估计PKId是ParentId的父节点吧
给你举个例子,就只用这两个字段吧,其他的也没多大用
PKId ParentId
1 0
2 0
3 1
4 2
5 1

假设数据是我上边这样的
可以假设每个PKId分别为商品大类,就把1的定义为软件吧,2定义为硬件,3为硬盘,4为ps软件,5为主板

这样的话,你就能看出对应关系了吧?
1和2是最高层的,所以无父节点,所以ParentId为0
3和5都是硬件,所以归属为1
4为软件,所以归属为2
这样的好处是减少多次读取其他表里的无用信息,在一定程度上可以提高效率,当然是指数据量大的时候,数据量小的时候基本没什么区别
作用你自己都说了,其实就是实现自我关联

但是这样有一点不好,在自身有主键外键,如果其中的逻辑关系弄的不太清楚的话,很容易出问题,简单来说就是这样了

‘陆’ 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语句中怎么实现递归查询

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

‘捌’ sql存储过程用递归

表结构:
sale_area销售分区表
PK#area_id
class_id
gonghao

prod_class产品分类表
PK#class_id
class_name

问题sql语句:
select distinct pa.class_id from prod_class As pa,prod_class As pb,sale_area where pb.class_id in(select sale_area.class_id from sale_area where sale_area.gonghao=<param>) and pa.class_id like pb.class_id||'%'

问题定义:
根据传入的参数gonghao来确定对应的class_id集,然后遍历这个class_id集,并“扩充”这个集合
要理解“扩充”必须知道class_id是这样设等级:
0为最高级
|_01
| |_011
| |_012
|_02
|_011
|_012
那么拥有等级0的话,所有的等级都应该可以访问,拥有等级01的话,011、012也可以访问。
这句sql的目的就是得到当前员工能访问的所有产品分类及它的子集。

通过自连接的做法在Oracle里是对的,在DB2里就错,原因在于DB2中谓词like两边至少有一个是字符串,也就是说DB2不认为pb.class_id||'%'是字符串。

求解:
要完成上面的任务有什么可替代的办法或改进的地方,注意环境是DB2 UDB 7.2。
---------------------------------------------------------------

就是树的问题。
使用公共表达式可以完成。
你在信息中心里面按recusion去搜索,可以找到递归sql的写法。
---------------------------------------------------------------

问题写的很清楚,我喜欢!
如果要使用DB2的公共表达式建议你把
prod_class产品分类表结构改一下
PK#class_id
class_name
Parent_Class_id

sql语句如下:

with temp_class_id( class_id,class_name)
(
select pc.class_id,pc.class_name from prod_class pc
where pc.class_id in (select sale_area.class_id from sale_area
where sale_area.gonghao=<param>)
union
select pc.class_id,pc.class_name from prod_class pc,
temp_class_id tc
where pc.parent_id = tc.class_id)
select * from temp_class_id;

‘玖’ SQL递归操作

这哪里是递归了?
回去好好看看课本什么叫递归再来问

热点内容
电影一场戏分镜头脚本 发布:2024-11-22 06:20:18 浏览:101
服务器程序乱了怎么办 发布:2024-11-22 06:09:43 浏览:543
分类导航源码 发布:2024-11-22 06:08:21 浏览:586
android网络定位 发布:2024-11-22 06:00:24 浏览:983
战争雷霆和绝地求生哪个配置高 发布:2024-11-22 06:00:12 浏览:900
威驰锋潮版有哪些配置 发布:2024-11-22 05:53:09 浏览:834
usbwifilinux 发布:2024-11-22 05:48:19 浏览:600
辅助存储器的作用 发布:2024-11-22 05:37:34 浏览:90
java反反编译 发布:2024-11-22 05:30:00 浏览:102
消毒液如何配置消毒酒精 发布:2024-11-22 05:29:53 浏览:61