• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
洛客
追求完美的用户体验。
博客园    首页    新随笔    联系   管理    订阅  订阅

SQL递归查询

declare  @t table(RecID int,PUnitNo nvarchar(100),UnitNo nvarchar(100),PathDepth int,Path nvarchar(100))
declare @level int
set @level=1

insert into @t
SELECT RecID,PUnitNo,UnitNo,@level AS PathDepth,Path
FROM RptSystemTree WHERE PUnitNo=''

WHILE @@rowcount>0
BEGIN
    SET @level=@level+1
    INSERT INTO @t
    select a.RecID,a.PUnitNo,a.UnitNo,@level,(CASE WHEN b.Path='' THEN a.PUnitNo ELSE  b.Path+'.'+a.PUnitNo END)
    from RptSystemTree a,@t b
    where a.PUnitNo=b.UnitNo
    and b.PathDepth=@level-1
END

UPDATE RptSystemTree SET RptSystemTree.PathDepth = t.PathDepth,
RptSystemTree.Path = t.Path
FROM @t t
WHERE t.RecID = RptSystemTree.RecID


-------------------------------------
create table t
(bid int,   p_bid      int)
insert into t
select 1,         null  union all
select 2,           1   union all
select 3,           1   union all
select 4,           3   union all
select 5,           4   union all
select 6,           5   union all
select 7,           1   union all
select 8,           2


create function dbo.aa(@parent int)
returns @t table(p_bid int,bid int,level int)
as
begin
  declare @level int
  set @level=1
  insert into @t
  select p_bid,bid,@level from t where p_bid=@parent
  while @@rowcount>0
    begin
      set @level=@level+1
      insert into @t
      select a.p_bid,a.bid,@level
      from t a,@t b
      where a.p_bid=b.bid
      and b.level=@level-1
    end
  return
end
GO
select space(level*5)+cast(bid as varchar),* from dbo.aa(1)

posted @ 2008-03-24 20:51  洛客  阅读(1651)  评论(1)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3