求助:递归查询难题?

wtydoone wtydoone 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区
表名称T_DB_DirMgt
字段名 : 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,提供两种递归算法

fox2628

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; }

chen4246197

SQL如何实现MYSQL的递归查询

主要介绍了根据递归到迭代转化的思路,利用SQL实现了MYSQL的递归查询,需要的朋友可以参考下

weixin_38655561

Oracle递归查询

有的情况下,我们需要用递归的方法整理数据,这才程序中很容易做到,但是在数据库 中,用SQL语句怎么实现?下面我以最典型的树形结构来说明下如何在Oracle使用递归查 询。 为了说明方便,创建一张数据库表,用于存储一个简单的树形结构

lifei19840406

Oracle中的树状查询(递归查询)

Oracle中的树状查询(递归查询),权限查询,树形结构

zhongxiutao123
评论 10
收藏 已收藏
分享
返回顶部
wtydoone
疑难问题 22,298 成员 121,727 内容