亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 數據庫 > SQL Server > 正文

SQL Server 公用表表達式(CTE)實現遞歸的方法

2024-08-31 01:04:53
字體:
來源:轉載
供稿:網友

公用表表達式簡介:

公用表表達式 (CTE) 可以認為是在單個 SELECT、INSERT、UPDATE、DELETE 或 CREATE VIEW 語句的執行范圍內定義的臨時結果集。CTE 與派生表類似,具體表現在不存儲為對象,并且只在查詢期間有效。與派生表的不同之處在于,公用表表達式 (CTE) 具有一個重要的優點,那就是能夠引用其自身,從而創建遞歸 CTE。遞歸 CTE 是一個重復執行初始 CTE 以返回數據子集直到獲取完整結果集的公用表表達式。

下面先創建一個表,并插入一些數據:

create table Role_CTE( Id  int    not null, Name nvarchar(32) not null, ParentId int  not null )insert into Role_CTE(Id,Name,ParentId)select '1','超級管理員','0' union select '2','管理員A','1' union select '3','管理員B','2' union select '4','會員AA','2' union select '5','會員AB','2' union select '6','會員BA','3' union select '7','會員BB','3' union select '8','用戶AAA','4' union select '9','用戶BBA','7' -- 創建一個復合聚集索引create clustered index Clu_Role_CTE_Indexon Role_CTE(Id,ParentId)with( pad_index=on, fillfactor=50, drop_existing=off, statistics_norecompute=on)select * from Role_CTE

sqlserver,cte,遞歸,sql,server,公用表達式

查找指定節點的所有子孫節點:

使用普通 sql 語句實現:

declare @level intdeclare @node intdeclare @ResTab table( node int not null, lv  int not null )set @level=0  -- 表示初始的等級set @node=3   --表示初始的節點ID,即從指定的哪個節點開始查找insert into @ResTab    -- 為表變量插入初始的數據select Id,@level from Role_CTE where Id=@nodewhile(@@ROWCOUNT>0)begin set @level=@level+1 insert into @ResTab select b.Id,@level  from @ResTab a  join Role_CTE b on a.node=b.ParentId and lv=@level-1 -- join 等于 inner join(內連接)和自連接endselect a.node,b.Name,a.lv from @ResTab a left join Role_CTE b on a.node=b.Id

sqlserver,cte,遞歸,sql,server,公用表達式

以上是根據指定節點ID(3),查找父節點ID(即字段 ParentId)等于指定的節點ID,如果有就插入,并繼續循環。

PS:lv=@level-1 是重點,不然會進入死循環,作用就是限制只插入一次。

如果需要限制循環的次數,即遞歸的層數,那么只需要在 while 條件里面添加一個限制即可。如下:

declare @level intdeclare @node intdeclare @num intdeclare @ResTab table( node int not null, lv  int not null )set @level=0  -- 表示初始的等級set @node=3   --表示初始的節點ID,即從指定的哪個節點開始查找set @num=1  -- 指定遞歸層級,即循環的次數insert into @ResTab    -- 為表變量插入初始的數據select Id,@level from Role_CTE where Id=@nodewhile(@@ROWCOUNT>0 and @level<@num)begin set @level=@level+1 insert into @ResTab select b.Id,@level  from @ResTab a  join Role_CTE b on a.node=b.ParentId and lv=@level-1 -- join 等于 inner join(內連接)和自連接endselect a.node,b.Name,a.lv from @ResTab a left join Role_CTE b on a.node=b.Id

sqlserver,cte,遞歸,sql,server,公用表達式

當然,如果指定了循環次數,就可以不用 while 判斷語句的 @@rowcount>0 了。

使用 SQL CTE 實現:

declare @node int set @node=3;with temp_cteas( select Id,Name,0 lv  -- 查詢出“根節點”,即指定的起始節點 from Role_CTE  where Id=@node  union all select b.Id,b.Name,a.lv+1  from temp_cte a  join Role_CTE b on a.Id=b.ParentId)select * from temp_cte

sqlserver,cte,遞歸,sql,server,公用表達式

使用 CTE 控制遞歸的層數,與上面類似。如下:

declare @node int declare @num intset @node=3;set @num=1;with temp_cteas( select Id,Name,0 lv  -- 查詢出“根節點”,即指定的起始節點 from Role_CTE  where Id=@node  union all select b.Id,b.Name,a.lv+1  from temp_cte a  join Role_CTE b on a.Id=b.ParentId     and a.lv<@num  --控制遞歸層數)select * from temp_cte

sqlserver,cte,遞歸,sql,server,公用表達式

查找指定節點的所有祖先節點:

使用普通 sql 語句實現:

declare @level intdeclare @node intdeclare @num intdeclare @ResTab table( node int not null, lv  int not null )set @level=0 -- 表示初始的等級set @node=8   --表示初始的節點ID,即從指定的哪個節點開始查找set @num=2  -- 指定遞歸層級,即循環的次數while(@level<=@num and @node is not null) -- 如果為空就表示沒有查到父級了begin insert into @ResTab select @node,@level set @level=@level+1 select @node=ParentId  from Role_CTE  where Id=@nodeendselect a.node,b.Name,a.lv from @ResTab a left join Role_CTE b on a.node=b.Id

sqlserver,cte,遞歸,sql,server,公用表達式

使用 SQL CTE 實現:

declare @node int declare @num intset @node=8;set @num=2;with temp_cteas( select Id,Name,ParentId,0 lv  -- 查詢出“根節點”,即指定的起始節點 from Role_CTE  where Id=@node  union all select b.Id,b.Name,b.ParentId,a.lv+1  from temp_cte a  join Role_CTE b on a.ParentId=b.Id     and a.lv < @num  --控制遞歸層數)select * from temp_cte

sqlserver,cte,遞歸,sql,server,公用表達式

以上所述是小編給大家介紹的SQL Server 公用表表達式(CTE)實現遞歸的方法,希望對大家有所幫助,如果大家有任何疑問歡迎給我留言,小編會及時回復大家的,在此也非常感謝大家對VeVb武林網網站的支持!


注:相關教程知識閱讀請移步到MSSQL教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
精品丝袜一区二区三区| 主播福利视频一区| 精品亚洲国产视频| 国产精品久久av| 亚洲一区二区三区成人在线视频精品| 国产乱肥老妇国产一区二| 国产精品极品美女粉嫩高清在线| 精品少妇v888av| 国产亚洲精品91在线| 5278欧美一区二区三区| 日韩欧美国产黄色| 色哟哟入口国产精品| 中文字幕国产日韩| 欧美综合国产精品久久丁香| 欧美激情成人在线视频| 国产精品jizz在线观看麻豆| 97久久国产精品| 国产精品va在线播放| 日本人成精品视频在线| 国产日韩亚洲欧美| 亚洲精品videossex少妇| 日韩中文字幕av| 亚洲色图综合久久| 久久综合久久美利坚合众国| 在线视频欧美日韩| 久久人人爽国产| 欧美人交a欧美精品| 日韩在线免费视频观看| 国产91精品在线播放| 疯狂蹂躏欧美一区二区精品| 欧美精品videos性欧美| 国产一区红桃视频| 国产欧美日韩视频| 国产精品成人国产乱一区| 啪一啪鲁一鲁2019在线视频| 第一福利永久视频精品| 欧美成人精品激情在线观看| 国产精品电影一区| 国模吧一区二区| 久久亚洲私人国产精品va| 中文字幕久热精品视频在线| 欧美激情图片区| 91精品视频免费看| 欧美精品激情在线观看| 久久久综合免费视频| 91av成人在线| 在线观看91久久久久久| 精品欧美激情精品一区| 97色伦亚洲国产| 欧美xxxx14xxxxx性爽| 亚洲男人av电影| 国产在线观看精品一区二区三区| 欧美成人小视频| 亚洲va电影大全| 欧美大片va欧美在线播放| 国产精品久久97| 亚洲人成电影网站色www| 日韩av在线直播| 永久免费精品影视网站| 亚洲国产精品免费| 97视频国产在线| 91精品视频在线看| 日本19禁啪啪免费观看www| 亚州精品天堂中文字幕| 亚洲人a成www在线影院| 日韩在线观看电影| 日韩在线一区二区三区免费视频| 亚洲午夜久久久影院| 亚洲最大的网站| 日韩视频―中文字幕| 亚洲影院色在线观看免费| 亚洲精品动漫久久久久| 欧美一区二区.| 丰满岳妇乱一区二区三区| 久久亚洲精品毛片| 久久成人国产精品| 国产精品久久91| 欧美日韩国产丝袜美女| 国产日韩av在线播放| 成人在线视频福利| 欧美国产在线视频| 成人免费视频97| 欧美精品国产精品日韩精品| 成人免费xxxxx在线观看| 中文字幕日韩精品在线| 97久久精品人人澡人人爽缅北| 亚洲香蕉成人av网站在线观看| 欧美一级片在线播放| 精品国产视频在线| 57pao国产成人免费| 国产精品扒开腿做爽爽爽男男| 国产激情视频一区| 欧美人与性动交| 欧美视频不卡中文| 欧美猛少妇色xxxxx| 国产精品福利无圣光在线一区| 亚洲美女在线视频| 日韩av中文字幕在线播放| 欧美成人精品不卡视频在线观看| 亚洲欧美激情精品一区二区| 国产成人aa精品一区在线播放| 日韩在线观看电影| 亚洲精品久久久久久久久久久久| 国产一区二区动漫| 欧美性受xxxx白人性爽| 日本道色综合久久影院| 91在线观看欧美日韩| 欧美亚洲一区在线| 国产精品第一第二| 欧美性猛交视频| 久久综合久久美利坚合众国| 欧美极品少妇xxxxx| 国产精品一区二区电影| 成人国产精品久久久| 九九热这里只有在线精品视| 亚洲精品99久久久久中文字幕| 国产视频精品在线| 中文字幕精品影院| 一区二区欧美亚洲| 亚洲人成电影网站色| 国产精品极品尤物在线观看| 日韩精品久久久久久久玫瑰园| 成人网中文字幕| 国产成人自拍视频在线观看| 欧美久久精品一级黑人c片| 国产精品mp4| 色伦专区97中文字幕| 亚洲精品国产综合区久久久久久久| 国产精品男人的天堂| www日韩欧美| 91免费精品国偷自产在线| 国产午夜精品视频| 国产精品自产拍高潮在线观看| 欧美一区二区三区免费观看| 欧美成人中文字幕| 欧美视频不卡中文| 亚洲自拍偷拍第一页| 亚洲精品福利视频| 欧美亚洲午夜视频在线观看| 日韩在线视频观看正片免费网站| 日韩av手机在线看| 久久久久久国产精品三级玉女聊斋| 国产午夜精品视频免费不卡69堂| 久久伊人91精品综合网站| 精品女厕一区二区三区| 日韩欧美国产免费播放| 久久久人成影片一区二区三区| 亚洲激情免费观看| 欧美亚洲午夜视频在线观看| 爽爽爽爽爽爽爽成人免费观看| 国产精品观看在线亚洲人成网| 国模私拍一区二区三区| 亚洲精品久久久久久久久久久| 91av在线播放| 欧美日韩亚洲国产一区| 国产一区二区三区在线视频| 亚洲欧美中文日韩在线v日本| 欧美香蕉大胸在线视频观看| 亚洲美腿欧美激情另类| 91精品久久久久久| 欧美国产精品va在线观看| 国产日韩精品综合网站| 国产一区在线播放| 人九九综合九九宗合|