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,
4.执行递归查询语句,将答案添加到nocycle元素中,就不会有[ora-01436:CONNECTBYerrorintheuserdata]。执行结果如下:
Select*
来自test_connectt
从id=4开始
由nocyclepriort连接。p_id=t.i.
应该是这样:
with qry as (select user_id,parent_id from tab where user_id = 32
union all
select tab.user_id,tab.parent_id from tab,qry
where tab.parent_id = qry.id)
select * from qry
我用mysql5.0.22,不支持上述语法,oracle就可以(sqlserver应该也可以):
create table tab1(user_id int, parent_id int)
insert into tab1 values(1,null)
insert into tab1 values(32,1)
insert into tab1 values(101,32)
insert into tab1 values(102,32)
insert into tab1 values(201,101)
insert into tab1 values(202,101)
insert into tab1 values(203,102)
insert into tab1 values(204,102)
select * from tab1
with qry(user_id,parent_id) as (select user_id,parent_id from tab1 where user_id = 32
union all
select tab1.user_id,tab1.parent_id from tab1,qry
where tab1.parent_id = qry.user_id
)
select * from qry
所以,mysql没有办法了,只有写函数,用循环来实现了。
首先说一下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
END
调用的时候:select queryChildrenPowerInfo("fa2528924c7e9168014c9bedfe04039c")该语句会返回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('fa2528924c7e9168014c9bedfe04039c'))
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)