最近在轉.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...