SQL Server 父子级关系 学习

初学SQL Server 做一个 分类父子级
在这里插入图片描述
后台数据库图示
在这里插入图片描述
根据已知的ID和Parent之间的对应关系列出 LevelTest字段对应的父子级关系

大体思路

  1. 游标最外层循环所有行数,内层while循环 循环父子层关系.
  2. 设置 退出 循环状态 当最顶层的 父级为-1 时 退出循环,
  3. 父子层循环每次父级+自身 ID
  4. select @iTempId =ID, @PParent = parent from MALL_ShelvesClass where ID = @Parent每次循环一遍条件@Parent 转化成 祖父层 @PParent
  5. 循环后清空变量

对应的sql 代码

declare @Parent int,
		@PParent int, --祖父层
		@strLever varchar(50), --存放层级关系
		@iflag int, --循环标志
		@iTid int,--
		@iLevel int,--层级数量
		@iTempId int--用来测试 select语句shi
update MALL_ShelvesClass set Leveltest =null,iLevel=null 
set @iflag = 0
set @strLever = ''
set @iLevel =0
--声明游标为ID
declare order_cursor cursor

for select[ID],[parent]from dbo.MALL_ShelvesClass order by ID desc
--打开游标--
open order_cursor
--开始循环游标变量
fetch next from order_cursor into @iTid,@Parent -- 取出ID 和 父层 赋值到变量
	while @@FETCH_STATUS = 0   --返回被 FETCH语句执行的最后游标的状态--
	begin	
		set @strLever = cast(@iTid as varchar(50))
		
			while @iflag = 0
			begin		
				if @Parent=-1 --1层情况 或者是多层的最顶层(主要判断是否循环到顶层)
					begin
					 set @iflag =1 --退出循环	
					end
				else --当有多层情况
					begin
						select @iTempId =ID, @PParent = parent from MALL_ShelvesClass where ID = @Parent --每循环一次 @parent变成自己@PParent
						if isnull(@iTempId,'') = @Paren
						begin
							set @Parent = @PParent --将祖父层 付给 父层 下次循环时 将祖父层作为 ID 进行查找 并赋值
							set @strLever = CAST(@iTempId as varchar(50))+','+@strLever --iTempId对应的是父层之前付过值 =@Parent
						end
						else 
						begin
							set @strLever='没有父层或者sql写错'
						end
					end
				set @iLevel +=1 
			end
			update MALL_ShelvesClass set Leveltest = @strLever,iLevel =@iLevel   where ID = @iTid
			set @iflag = 0
			set @iLevel =0
			set @strLever =''
		
		fetch next from order_cursor into @iTid,@Parent   --转到下一个游标
		
		end

close order_cursor  --关闭游标
deallocate order_cursor   --释放游标

select ID,iLevel,Parent,Level,Leveltest from MALL_ShelvesClass

select * from MALL_ShelvesClass

结果如图
在这里插入图片描述
当有多层时
在这里插入图片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章