SQL 儲存過程CET遞迴查詢獲得樹的葉子節點

2021-07-03 11:12:53 字數 4827 閱讀 7655

use [sooilsemanticsdb]

go/****** object: storedprocedure [dbo].[usp_semantics_getleaf] script date: 2015/6/24 17:37:57 ******/

set ansi_nulls on

goset quoted_identifier on

goalter procedure [dbo].[usp_semantics_getleaf]

( @parent nvarchar(255),

@sr varchar(20))as

begin

with childs(conceptclassid,glossaryid)

as ( select s.cc2,s.t2

from [dbo].[semantics] s

inner join [dbo].[ccterm] cc on s.cc1 = cc.[conceptclassid] and s.t1 = cc.[glossaryid]

inner join [dbo].[glossary] g on s.t1 = g.id

where g.term = @parent

and s.sr = @sr

union all

select s.cc2,s.t2

from childs c

inner join [dbo].[semantics] s on c.conceptclassid = s.cc1 and c.glossaryid = s.t1

where s.sr = @sr

)select class.tag

,class.[type]

,g.term

from childs child

inner join [dbo].[conceptclass] class on child.conceptclassid = class.id

inner join [dbo].[glossary] g on child.glossaryid = g.id

left join [dbo].[semantics] s on child.conceptclassid = s.cc1 and child.glossaryid = s.t1 and s.sr = @sr

where s.t1 is null

--select class.tag

-- ,class.[type]

-- ,g2.term

--from [dbo].[semantics] s1

-- inner join [dbo].[ccterm] cc1 on s1.cc1 = cc1.[conceptclassid] and s1.t1 = cc1.[glossaryid]

-- inner join [dbo].[glossary] g1 on s1.t1 = g1.id

-- inner join [dbo].[ccterm] cc2 on s1.cc2 = cc2.[conceptclassid] and s1.t2 = cc2.[glossaryid]

-- inner join [dbo].[glossary] g2 on s1.t2 = g2.id

-- inner join [dbo].[conceptclass] class on s1.cc2 = class.id

-- left join [dbo].[semantics] s2 on s1.cc2 = s2.cc1 and s1.t2=s2.t1 and s1.sr = s2.sr

--where g1.term = @parent

-- and s1.sr = @sr

-- and s2.t1 is not null

end

sql cet 遞迴查詢

簡單示例

create table tree  

( id int identity(1,1) primary key not null,

name varchar(20) not null,

parent varchar(20) null

) go

insert tree values('大學',null)

insert tree values('學院','大學')

insert tree values('計算機學院','學院')

insert tree values('網路工程','計算機學院')

insert tree values('資訊管理','計算機學院')

insert tree values('電信學院','學院')

insert tree values('教務處','大學')

insert tree values('材料科','教務處')

insert tree values('招生辦','大學')

go

with cte as

( -->begin 乙個定位點成員

select id, name,parent,cast(name as nvarchar(max)) as te,0 as levle from tree where parent is null

-->end

union all

-->begin乙個遞迴成員

select tree.id, tree.name,tree.parent,cast(replicate(' ',len(cte.te))+'|_'+tree.name as nvarchar(max)) as te,levle+1 as levle

from tree inner join cte

on tree.parent=cte.name

-->end

) select * from cte order by id

--1.將 cte 表示式拆分為定位點成員和遞迴成員。  

--2.執行定位點成員,建立第乙個呼叫或基準結果集 (t0)。  

--3.執行遞迴成員,將 ti 作為輸入(這裡只有一條記錄),將 ti+1 作為輸出。  

--4.重複步驟 3,直到返回空集。  

--5.返回結果集。這是對 t0 到 tn 執行 union all 的結果。

另一種修改後的查詢方法

with cte as    

(

-->begin 乙個定位點成員

select id, name,parent,cast(name as nvarchar(max)) as te,

row_number()over(order by getdate()) as orderid

--最關鍵是上面這個字段,要獲取排序字段,按字串來排序。

--其中視窗函式必須要使用order by,但是不能用整型,那就用時間吧

from tree where parent is null

-->end

union all

-->begin乙個遞迴成員

select tree.id, tree.name,tree.parent,cast(replicate(' ',len(cte.te))+'|_'+tree.name as nvarchar(max)) as te,

cte.orderid*100+row_number()over(order by getdate()) as orderid

from tree inner join cte

on tree.parent=cte.name

-->end replicate

將字串值重複指定的次數

)

select * from cte

order by ltrim(orderid)--最後將這個整型資料轉換為字串型的進行排序

--有時候整型可以比大小,字串也可以,字串比的大小是一位一位進行字元比較的  

--整型+字串==整型,只有字串+字串==兩個字串的並和  

--遞迴查詢中:第二條記錄可以引用第一條記錄的值  

--動態載入記錄時,同乙個等級的記錄識別符:rownumber()over(order by getdate())  

--延伸:可以動態獲取某個部門下的所以子部門。也可以獲取該部門上級的所以部門  

--總結:首先要拼湊出乙個整型資料,然後轉換為字串,最後是進行字串的order,而不是整型資料的order,

註解:

cast 和 convert

將某種資料型別的表示式顯式轉換為另一種資料型別。cast 和 convert 提供相似的功能。

語法使用 cast:

cast ( expression as data_type ) 

使用 convert:

convert (data_type[(length)], expression [, style])

引數expression

是任何有效的 microsoft® sql server™ 表示式。有關更多資訊,請參見表示式。 

data_type

目標系統所提供的資料型別,包括 bigint 和 sql_variant。不能使用使用者定義的資料型別。有關可用的資料型別的更多資訊,請參見資料型別。 

length

nchar、nvarchar、char、varchar、binary 或 varbinary 資料型別的可選引數。 

資料庫遞迴查詢(CET)

if object id ta isnotnull droptable ta go createtableta id int,name nvarchar 4 parentid nvarchar 2 go insertintota select1,河北省 0 unionall select2,邢台市 ...

儲存過程系列之儲存過程sql查詢儲存過程的使用

1.查詢某個表被哪些儲存過程 以下簡稱 sp 使用到 select distinct object name id from syscomments where id in select object id from sys.objects where type p and text like ta...

儲存過程系列之儲存過程sql查詢儲存過程的使用

1.查詢某個表被哪些儲存過程 以下簡稱 sp 使用到 select distinct object name id from syscomments where id in select object id from sys.objects where type p and text like ta...