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
*/



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值