递归树查询

墨蓝 2022-09-29 13:56 164阅读 0赞
  1. --表结构
  2. CREATE TABLE [dbo].[PSY_Web_MenuClass](
  3. [ModuleCode] [varchar](32) NOT NULL,
  4. [ModuleName] [varchar](128) NOT NULL,
  5. [ShortModuleName] [varchar](64) NULL,
  6. [LevelID] [int] NOT NULL,
  7. [ParentCode] [varchar](32) NULL
  8. CONSTRAINT [PK_PSY_WEB_MENUCLASS] PRIMARY KEY NONCLUSTERED
  9. (
  10. [ModuleCode] ASC
  11. )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
  12. ) ON [PRIMARY]
  13. /* ModuleCode 根节点,ParentCode 父节点*/
  14. CREATE FUNCTION f_MenuSort(@ModuleCode varchar(32)=NULL,@sort int=1)
  15. RETURNS @t_Level TABLE(ModuleCode varchar(32),sort int)
  16. AS
  17. BEGIN
  18. DECLARE cod_cur CURSOR LOCAL
  19. FOR
  20. SELECT ModuleCode FROM PSY_Web_MenuClass
  21. WHERE ParentCode=@ModuleCode OR (@ModuleCode IS NULL AND ParentCode IS NULL)
  22. OPEN cod_cur
  23. FETCH cod_cur INTO @ModuleCode
  24. WHILE @@FETCH_STATUS=0
  25. BEGIN
  26. INSERT @t_Level VALUES(@ModuleCode,@sort)
  27. SET @sort=@sort+1
  28. IF @@NESTLEVEL<32 --如果递归(嵌套查询)层数未超过32层(递归(嵌套查询)最大允许32层)
  29. BEGIN
  30. --开始递归查找当前节点的子节点
  31. INSERT @t_Level SELECT * FROM f_MenuSort(@ModuleCode,@sort)
  32. SET @sort=@sort+@@ROWCOUNT --排序号加上子节点个数
  33. END
  34. FETCH cod_cur INTO @ModuleCode
  35. END
  36. RETURN
  37. END
  38. GO
  39. SELECT a.*
  40. FROM PSY_Web_MenuClass a,f_MenuSort('MYSUN',2) b
  41. WHERE a.ModuleCode=b.ModuleCode
  42. --------------------------------------------------2
  43. CREATE FUNCTION f_LPad
  44. (
  45. @i int,@len int
  46. )
  47. RETURNS nvarchar(max)
  48. AS
  49. BEGIN
  50. RETURN cast (replicate('0', @len - len(@i) ) + convert(nvarchar,@i) as nvarchar(max))
  51. END
  52. CREATE PROCEDURE PSYP_GetMenuTree
  53. ----单个父节点
  54. @MenuCode varchar(32)=NULL
  55. AS
  56. BEGIN
  57. with ReplicateMenu
  58. as
  59. (
  60. select *,0 as Level,cast('0' as nvarchar(max)) as TreePath from PSY_Web_MenuClass where ModuleCode = @MenuCode
  61. union all
  62. select A.*,rm.Level + 1,rm.TreePath + dbo.f_LPad(Row_Number() over (order by A.ModuleCode desc),8) as TreePath from PSY_Web_MenuClass as A inner join ReplicateMenu as rm on A.ParentCode = rm.ModuleCode )
  63. SELECT * from ReplicateMenu
  64. END
  65. ----单个父节点
  66. Create PROCEDURE PSYP_GetMenuTree
  67. ---多父节点
  68. @MenuCode varchar(32)=NULL
  69. AS
  70. BEGIN
  71. with ReplicateMenu
  72. as
  73. (
  74. select *,0 as Level,cast(Row_Number() over (order by A.ModuleCode desc) as nvarchar(max)) as TreePath from PSY_Web_MenuClass where ModuleCode = @MenuCode
  75. union all
  76. select csc.*,rm.Level + 1,rm.TreePath + dbo.Lpad(Row_Number() over (order by A.ModuleCode desc),8) as TreePath from PSY_Web_MenuClass as A inner join ReplicateMenu as rm on A.ParentCode = rm.ModuleCode )
  77. SELECT * from ReplicateMenu
  78. END
  79. ---多父节点
  80. exec psyp_GetMenuTree 'MYSUN'

发表评论

表情:
评论列表 (有 0 条评论,164人围观)

还没有评论,来说两句吧...

相关阅读

    相关 Java 查询组织机构

    > 需求:现有一个A集合(机构id集合),需要利用A集合查询出集合中所有机构的子级机构,层级(不知道一共有多少级),最终返回所有的子级机构(就是返回一个childOrganLi