sqlServer 實現 遞迴查詢導航欄

2021-10-06 11:57:57 字數 2850 閱讀 9042

最近在轉.net,  需要做乙個導航欄的功能, 這裡記錄下通過sql直接遞迴實現查詢某個導航下面所有文章的sql語句

sql server 2005之前的版本只能用函式方法實現,sql server 2005之後新增了cte功能,可以利用cte實現遞迴查詢;

cte:公用表示式common table expression 是sql server 2005版本之後引入的乙個特性;

分類表和文章表 表結構

分類表結構

idint

pidint

name

nvarchar(256)

sort

intseotitle

nvarchar(256)

seokeyword

nvarchar(max)

seodesc

nvarchar(max)

createtime

datetime

分類表內容

文章表結構

idcategoryid

title

[content]

sort

seotitle

seokeyword

seodesc

createtime

updatetime

解釋

問題:

1  查詢頂級分類下的所有文章,注意 pid=0/第四行中 on c.pid=t.id

-- 使用臨時表,遞迴查詢導航下的所有分級導航

with temp as(

select * from doccate where pid=0

union  all

select c.* from doccate  c join  temp t on c.pid=t.id)

select temp.id,temp.name into #temp11221 from temp

-- 分頁查詢所有導航下的文章, 掠過0條取出10條

select #temp11221.name as categoryname,docinfo.* from docinfo join #temp11221 on docinfo.categoryid = #temp11221.id

order by sort  

offset 0 rows fetch next 10 rows only 

-- 查詢該導航下所有文章數量

select count(1) from docinfo join #temp11221 on docinfo.categoryid = #temp11221.id

-- 刪除臨時表

if object_id('tempdb..#temp11221') is not null begin

drop table #temp11221

end

2 查詢非頂級分類下的所有文章,注意 id=13/第四行中 on c.pid=t.id

-- 使用臨時表,遞迴查詢導航下的所有分級導航

with temp as(

select * from doccate where id=13

union  all

select c.* from doccate  c join  temp t on c.pid=t.id)

select temp.id,temp.name into #temp11221 from temp

-- 分頁查詢所有導航下的文章, 掠過0條取出10條

select #temp11221.name as categoryname,docinfo.* from docinfo join #temp11221 on docinfo.categoryid = #temp11221.id

order by sort  

offset 0 rows fetch next 10 rows only 

-- 查詢該導航下所有文章數量

select count(1) from docinfo join #temp11221 on docinfo.categoryid = #temp11221.id

-- 刪除臨時表

if object_id('tempdb..#temp11221') is not null begin

drop table #temp11221

end

3/查詢分類(頂級/非頂級)之前的分類 , 逆向遞迴查詢

-- 使用臨時表,遞迴查詢導航下的所有分級導航

with temp as(

select * from doccate where id=16

union  all

select c.* from doccate  c join  temp t on c.id=t.pid)

select temp.id,temp.name into #temp11221 from temp

-- 分頁查詢所有導航下的文章, 掠過0條取出10條

select * from #temp11221

-- 刪除臨時表

if object_id('tempdb..#temp11221') is not null begin

drop table #temp11221

end

Sql Server 使用CTE實現遞迴查詢

遞迴cte是sql server 2005中重要的增強之一。一般我們在處理樹,圖和層次結構的問題時需要用到遞迴查詢。cte的語法如下 1with cte as2 3select empid,reportto,fname from employ where empid 1 4union all5 se...

sqlserver的CTE實現遞迴查詢

遞迴查詢 ifobject id digui u is notnull drop table digui create table digui id varchar 50 parentid varchar 50 insert into dbo.digui id,parentid select 第三層...

SQLServer 遞迴查詢

感謝文章遞迴查詢,正好趁此機會梳理一下資料庫的遞迴查詢 公用表表示式 cte 可以認為是在單個 select insert update delete 或 create view 語句的執行範圍內定義的臨時結果集。公用表表示式可以包括對自身的引用,這種表示式稱為遞迴公用表表示式。with expre...