初學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
結果如圖
當有多層時