求助:递归查询难题?
字段名 : pDirID int ---- 上级目录ID
DirID int ----- 目录ID
DirName varchar(100) ------ 目录名称
表名称T_DB_DirMgt 的数据如下:
目录id 目录名称 上级目录ID
122 jkljkljkljkl 0 ---代表根目录
123 hjkghjkgh 122
124 436545 122
125 ftrhyre 124
126 t5uy54 124
127 truytyu 124
128 gjmmtr 124
129 435 124
130 ret 129
132 567YTU 129
133 GFHJ 129
134 HGJ 132
135 GFJ 132
136 ,MBVMJHVJ 134
我想达到以下效果:
目录名称 :由类似 “父目录名称\上级目录名称\目录名称” 这个种形式组成。
jkljkljkljkl
jkljkljkljkl\hjkghjkgh
jkljkljkljkl\436545
jkljkljkljkl\436545\ftrhyre
jkljkljkljkl\436545\t5uy54
jkljkljkljkl\436545\truytyu
jkljkljkljkl\436545\gjmmtr
jkljkljkljkl\436545\435
jkljkljkljkl\436545\435\ret
jkljkljkljkl\436545\435\567YTU
jkljkljkljkl\436545\435\GFHJ
jkljkljkljkl\436545\435\567YTU\HGJ
jkljkljkljkl\436545\435\567YTU\GFJ
jkljkljkljkl\436545\435\567YTU\HGJ\,MBVMJHVJ
要怎么样来写一个过程函数,或存储过程,返回“由类似 “父目录名称\上级目录名称\目录名称” 这个
种形式组成”结果
我试用递归查询,如下:
/******************************************************************/
CREATE FUNCTION dbo.FC_SYS_DirMgt_UpSubTree(
/*******************************************************************************************
**********************
* 功能:取得当前目录所有子目录
* 参数:@DirID------目录ID
* 返回:含有取得当前目录所有详细从父目录到子目录的一张表
* 作者:wuty
********************************************************************************************
********************/
@DirID AS int
)
RETURNS @treeinfo table(
[DirID] int NOT NULL,
[DirName] varchar(500) NOT NULL,
[pDirID] int NOT NULL,
[level] int NOT NULL
) AS
BEGIN
DECLARE @level AS int
SELECT @level = 0
If @DirID = '0'
INSERT INTO @treeinfo
SELECT [DirID],[DirName],[pDirID],@level
FROM [T_DB_DirMgt]
WHERE pDirID = @DirID
else
INSERT INTO @treeinfo
SELECT [DirID],[DirName],[pDirID],@level
FROM [T_DB_DirMgt]
WHERE DirID = @DirID
WHILE @@ROWCOUNT > 0
BEGIN
SET @level = @level + 1
INSERT INTO @treeinfo
SELECT E.[DirID],T.[DirName]+'\'+E.[DirName],E.[pDirID],@level
FROM [T_DB_DirMgt] AS E JOIN @treeinfo AS T
ON E.[pDirID] = T.[DirID] AND T.[level] = @level - 1
END
RETURN
END
/**********************************************************************/
以上若取select * from dbo.FC_SYS_DirMgt_UpSubTree('122')
可以达到以上效果,
jkljkljkljkl
jkljkljkljkl\hjkghjkgh
jkljkljkljkl\436545
jkljkljkljkl\436545\ftrhyre
jkljkljkljkl\436545\t5uy54
jkljkljkljkl\436545\truytyu
jkljkljkljkl\436545\gjmmtr
jkljkljkljkl\436545\435
jkljkljkljkl\436545\435\ret
jkljkljkljkl\436545\435\567YTU
jkljkljkljkl\436545\435\GFHJ
jkljkljkljkl\436545\435\567YTU\HGJ
jkljkljkljkl\436545\435\567YTU\GFJ
jkljkljkljkl\436545\435\567YTU\HGJ\,MBVMJHVJ
但是我若执行select * from dbo.FC_SYS_DirMgt_UpSubTree('129')结果如下:
目录id 目录名称 上级目录ID
129 435 124
130 435\ret 129
132 435\567YTU 129
133 435\GFHJ 129
134 435\567YTU\HGJ 132
135 435\567YTU\GFJ 132
136 435\567YTU\HGJ\,MBVMJHVJ 134
====================
达不到以下效果:
jkljkljkljkl\436545\435
jkljkljkljkl\436545\435\ret
jkljkljkljkl\436545\435\567YTU
jkljkljkljkl\436545\435\GFHJ
jkljkljkljkl\436545\435\567YTU\HGJ
jkljkljkljkl\436545\435\567YTU\GFJ
jkljkljkljkl\436545\435\567YTU\HGJ\,MBVMJHVJ
但是我水平有限制达不到返回“由类似 “父目录名称\上级目录名称\目录名称” 这个种形式组成”
结果效果。
大家帮帮忙呀!
相关推荐
两种mysql递归tree查询效率-mysql递归tree
两种mysql递归tree查询效率-mysql递归tree,提供两种递归算法
java树形结构递归查询
/** * 根据等级查询类目树 * * @param level * @return */ @Override public List queryCategoryTree(Integer level) { //查询当前级别下类目 List list = categoryDAO.list(level); //组装好的类目树,返回前端 List categoryTree = new ArrayList(); //所有类目 List allDTOList = new ArrayList(); if (CollectionUtils.isEmpty(list)) { return categoryTree; } for (CategoryDO categoryDO : list) { allDTOList.add(new CategoryTreeDTO().convertDOToDTO(categoryDO)); } //当前等级类目 categoryTree = allDTOList.stream().filter(dto -> level.equals(dto.getLevel())).collect(Collectors.toList()); for (CategoryTreeDTO categoryTreeDTO : categoryTree) { //组装类目为树结构 assembleTree(categoryTreeDTO, allDTOList,Constants.CATEGORY_MAX_LEVEL - level); } return categoryTree; } /** * 组装树 * * @param categoryTreeDTO * @param allList * @param remainRecursionCount 剩余递归次数 * @return */ public CategoryTreeDTO assembleTree(CategoryTreeDTO categoryTreeDTO, List allList, int remainRecursionCount) { remainRecursionCount--; //最大递归次数不超过Constants.CATEGORY_MAX_LEVEL-level次,防止坏数据死循环 if(remainRecursionCount < 0){ return categoryTreeDTO; } String categoryCode = categoryTreeDTO.getCategoryCode(); Integer level = categoryTreeDTO.getLevel(); //到达最后等级树返回 if (Constants.CATEGORY_MAX_LEVEL == level) { return categoryTreeDTO; } //子类目 List child = allList.stream().filter(a -> categoryCode.equals(a.getParentCode())).collect(Collectors.toList()); if (null == child) { return categoryTreeDTO; } categoryTreeDTO.setChildren(child); //组装子类目 for (CategoryTreeDTO dto : child) { assembleTree(dto, allList,remainRecursionCount); } return categoryTreeDTO; }
SQL如何实现MYSQL的递归查询
主要介绍了根据递归到迭代转化的思路,利用SQL实现了MYSQL的递归查询,需要的朋友可以参考下
Oracle递归查询
有的情况下,我们需要用递归的方法整理数据,这才程序中很容易做到,但是在数据库 中,用SQL语句怎么实现?下面我以最典型的树形结构来说明下如何在Oracle使用递归查 询。 为了说明方便,创建一张数据库表,用于存储一个简单的树形结构
Oracle中的树状查询(递归查询)
Oracle中的树状查询(递归查询),权限查询,树形结构


疑难问题
