SQL2005的CTE
Posted 中国风
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SQL2005的CTE相关的知识,希望对你有一定的参考价值。
use
test
go
if object_id ( ' Tempdb..#T ' ) is not null
drop table #T
create table #T(ID int ,Name nvarchar ( 100 ),parentID int )
insert #T select 1 , ' A ' , 0
insert #T select 2 , ' B ' , 1
insert #T select 3 , ' C ' , 1
insert #T select 4 , ' D ' , 3
insert #T select 5 , ' E ' , 2
go
with t2(ID,Name,parentID,Ord,Lev)
as
( select * ,Ord = cast ( right ( ' 0000 ' + rtrim (ID), 4 ) as nvarchar ( max )),Lev = cast ( 0 as int ) from #T where ParentID = 0
union all
select b. * ,Ord = a.Ord + cast ( right ( ' 0000 ' + rtrim (b.ID), 4 ) as nvarchar ( max )),Lev = cast (a.Lev + 1 as int ) from #T b join t2 a on b.ParentID = a.ID
)
select 顯示 = replicate ( char ( 9 ),lev) + Name from T2 order by ord option (maxrecursion 0 ) -- 用空格替換制表符時用space(lev*2)/replicate(char(9),lev)
/**/ /*
顯示
---------------------------------
A
B
E
C
D
(5 個資料列受到影響)
*/
; with t2
as
( select * ,Ord = cast (Name as nvarchar ( max )),lev = 0 from #T where ParentID = 0
union all
select b. * ,Ord = cast (a.Ord + char ( 9 ) + b.Name as nvarchar ( max )),a.lev + 1 from #T b join t2 a on b.ParentID = a.ID
)
select
[ 顯示 ] = Ord
from
T2
order by ord
option (maxrecursion 0 )
/**/ /*
顯示
--------------------
A
A B
A B E
A C
A C D
(5 個資料列受到影響)
*/
-- 2005多次调用连接时:
/**/ /*
;with T(COl)--可指定列名也可不指定
as
(......)
,T2(Co)
as
(......)
select * from T1 a join T2 b on a.Col=b.COl
*/
go
if object_id ( ' Tempdb..#T ' ) is not null
drop table #T
create table #T(ID int ,Name nvarchar ( 100 ),parentID int )
insert #T select 1 , ' A ' , 0
insert #T select 2 , ' B ' , 1
insert #T select 3 , ' C ' , 1
insert #T select 4 , ' D ' , 3
insert #T select 5 , ' E ' , 2
go
with t2(ID,Name,parentID,Ord,Lev)
as
( select * ,Ord = cast ( right ( ' 0000 ' + rtrim (ID), 4 ) as nvarchar ( max )),Lev = cast ( 0 as int ) from #T where ParentID = 0
union all
select b. * ,Ord = a.Ord + cast ( right ( ' 0000 ' + rtrim (b.ID), 4 ) as nvarchar ( max )),Lev = cast (a.Lev + 1 as int ) from #T b join t2 a on b.ParentID = a.ID
)
select 顯示 = replicate ( char ( 9 ),lev) + Name from T2 order by ord option (maxrecursion 0 ) -- 用空格替換制表符時用space(lev*2)/replicate(char(9),lev)
/**/ /*
顯示
---------------------------------
A
B
E
C
D
(5 個資料列受到影響)
*/
; with t2
as
( select * ,Ord = cast (Name as nvarchar ( max )),lev = 0 from #T where ParentID = 0
union all
select b. * ,Ord = cast (a.Ord + char ( 9 ) + b.Name as nvarchar ( max )),a.lev + 1 from #T b join t2 a on b.ParentID = a.ID
)
select
[ 顯示 ] = Ord
from
T2
order by ord
option (maxrecursion 0 )
/**/ /*
顯示
--------------------
A
A B
A B E
A C
A C D
(5 個資料列受到影響)
*/
-- 2005多次调用连接时:
/**/ /*
;with T(COl)--可指定列名也可不指定
as
(......)
,T2(Co)
as
(......)
select * from T1 a join T2 b on a.Col=b.COl
*/
以上是关于SQL2005的CTE的主要内容,如果未能解决你的问题,请参考以下文章