初学SQL Server 做一个 分类父子级
后台数据库图示
根据已知的ID和Parent之间的对应关系列出 LevelTest字段对应的父子级关系
大体思路
- 游标最外层循环所有行数,内层while循环 循环父子层关系.
- 设置 退出 循环状态 当最顶层的 父级为-1 时 退出循环,
- 父子层循环每次父级+自身 ID
- select @iTempId =ID, @PParent = parent from MALL_ShelvesClass where ID = @Parent每次循环一遍条件@Parent 转化成 祖父层 @PParent
- 循环后清空变量
对应的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
结果如图
当有多层时