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

結果如圖
在這裏插入圖片描述
當有多層時
在這裏插入圖片描述

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