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

sqlwith递归

发布时间: 2023-07-06 22:12:41

⑴ 高手帮忙:sql 里怎样递归判断父节点和子节

-- 查找所有父节点
with tab as
(
select Type_Id,ParentId,Type_Name from Sys_ParamType_V2_0 where Type_Id=316--子节点
union all
select b.Type_Id,b.ParentId,b.Type_Name
from
tab a,--子节点数据集
Sys_ParamType_V2_0 b --父节点数据集
where a.ParentId=b.Type_Id --子节点数据集.parendID=父节点数据集.ID
)
select * from tab;

-- 查找所有子节点
with tab as
(
select Type_Id,ParentId,Type_Name from Sys_ParamType_V2_0 where Type_Id=1--父节点
union all
select b.Type_Id,b.ParentId,b.Type_Name
from
tab a,--父节点数据集
Sys_ParamType_V2_0 b--子节点数据集
where b.ParentId=a.Type_Id --子节点数据集.ID=父节点数据集.parendID
)
select * from tab;

⑵ 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(''))

⑶ mysql 怎么实现sql的with递归

概念说不一定理解,给你一个例子你自己参悟。 SELECT TEACHER FROM C AS X WHERE UNIQUE(SELECT TEACHER FROM C AS Y WHERE Y.TEACHER=X.TEACHER);

⑷ 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数据库实现递归查询的几种代码方法

SQL 数据库 实现递归查询的几种代码方法 表结构

ProctCategory

CategoryID Level ParentCategoryID

数据

T SQL

WITH CategoryTemp(CategoryID ParentCategoryID) 临时表用来保存查到的Category

(

SELECT CategoryID ParentCategoryID FROM ProctCategory WHERE ParentCategoryID<= 将所有的第一层查出来作为初始数据 需要查第几层或者哪个ParentCategoryID下面所有的 N层 把ParentCategoryID赋相关的值即可

UNION ALL 查询N层

SELECT pc CategoryID ParentCategoryID FROM ProctCategory pc

LEFT JOIN CategoryTemp ct ON pc ParentCategoryID=ct CategoryID

WHERE ParentCategoryID> 因为第一层前面已经查出来了 所以这里把第一层筛选掉

)

SELECT CategoryID ParentCategoryID FROM CategoryTemp

结果

裂键档

如果把ParentCategoryID赋为 结果则为

实例

ID是否为部门 部门名 上级ID y 部门 y 部门 n 张三 n 李二 y 部门 n 王五 y 部门3亮贺 n 小三 我想找询 ID 值为 下级的所有人员包括下级部门的所有人员

创建查询函数 create function f_id( @id int 要查询的id )returns @re table(id int level int) as begin declare @l int set @l= insert @re select id @l from 表 where 上级id=@id while @@rowcount> begin set @l=@l+ insert @re select a id @l from 表 a join @re b on a 上级id=b id and b level=@l end return end go

调用函数进行查询 select a * from 表 a join f_id( ) b on a id=b id

联合查询

测试数据 create table 表(ID int 是否为部门 char( ) 部门名 varchar( ) 上级ID int) insert 表 select y 部门 union all select y 部门 union all肆乱 select n 张三 union all select n 李二 union all select y 部门 union all select n 王五 union all select y 部门 union all select n 小三 go

创建查询函数 create function f_id( @id int 要查询的id )returns @re table(id int level int) as begin declare @l int set @l= insert @re select id @l from 表 where 上级id=@id while @@rowcount> begin set @l=@l+ insert @re select a id @l from 表 a join @re b on a 上级id=b id and b level=@l end return end go

调用函数进行查询 select a * from 表 a join f_id( ) b on a id=b id go

删除测试 drop table 表 drop function f_id

/* 测试结果

ID 是否为部门 部门名 上级ID n 小三

lishixin/Article/program/MySQL/201311/29557

⑹ sql 怎么递归查询的方法:

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

热点内容
体检中心的无线网密码多少 发布:2025-02-09 05:40:15 浏览:515
脚本语言是编译还是解释 发布:2025-02-09 05:30:24 浏览:642
天墓密码结局是什么 发布:2025-02-09 05:25:52 浏览:437
如何找回因特网帐号的密码 发布:2025-02-09 05:20:05 浏览:373
树莓派源码 发布:2025-02-09 05:07:00 浏览:651
安卓手机为什么搜不到懂球帝 发布:2025-02-09 05:04:42 浏览:817
生命密码解读走什么 发布:2025-02-09 04:55:51 浏览:279
python常用正则表达式 发布:2025-02-09 04:42:53 浏览:179
机器人编程培训哪家好 发布:2025-02-09 04:37:44 浏览:308
上海怎么学习java 发布:2025-02-09 04:26:39 浏览:23