数据 为 : 
10001 路容保洁 10000 
10002 路面 10000 
10003 路基 10000 
10004 桥隧涵 10000 
10005 沿线设施 10000 
10006 机电设施 10000 
10007 绿化 10000 
10008 机械保洁 10001 
10009 人工保洁 10001 
10010 偶然事件 10001 
10011 沥青砼路面 10002 
10012 水泥砼路面 10002 
10013 附属构造物 10002 
10014 路基防护 10003 
10015 路基水毁 10003 
10016 路基排水 10003 
10017 桥梁 10004 
10018 涵洞 10004 
10019 隧道 10004 
10020 管理设施 10005 
10021 安全防护设施 10005 
10022 其他设施 10005 
10023 桥面铺装 10017 
10024 排水系统 10017 
10025 附属设施 10017 
10026 伸缩缝 10017 
10027 翼墙锥坡 10017 
10028 墩台 10017 
10029 台帽盖梁 10017 
10030 梁式构件 10017 
10031 桥与路连接 10017 
如何递归 形成自己的名字格式? 
格式如下: 
10023 桥隧涵-桥梁-桥面铺装 
10024 桥隧涵-桥梁-排水系统 
10025 桥隧涵-桥梁-附属设施 
10026 桥隧涵-桥梁-伸缩缝 
10027 桥隧涵-桥梁-翼墙锥坡 
10028 桥隧涵-桥梁-墩台 
10029 桥隧涵-桥梁-台帽盖梁 
10030 桥隧涵-桥梁-梁式构件 
10031 桥隧涵-桥梁-桥与路连接 我只想得到最底层的数据,名字显示方法 如格式中的那样~! 会的朋友来看看吧~!

解决方案 »

  1.   

    等一下,我找找ROY写的那个函数
      

  2.   

    http://topic.csdn.net/u/20080306/23/d3c100f2-cda1-4efa-927d-f1f7968884ce.html
    从这里抄的
    create   table   isc_catalog(nid   int,   npid   int,   ccategory   char(10)) 
    insert   into   isc_catalog   values('1',   '0',   '中国') 
    insert   into   isc_catalog   values('2',   '1',   '湖南省') 
    insert   into   isc_catalog   values('3',   '1',   '广东省') 
    insert   into   isc_catalog   values('4',   '3',   '广州市') 
    insert   into   isc_catalog   values('5',   '2',   '长沙市') 
    insert   into   isc_catalog   values('6',   '4',   '白云区') 
    insert   into   isc_catalog   values('7',   '5',   '雨花区') 
    insert   into   isc_catalog   values('8',   '2',   '娄底市')
    insert   into   isc_catalog   values('9',   '1',   '北京市')
    insert   into   isc_catalog   values('10',   '6',   '白云小区A')--新增一条记录
    go
    create  function F_test(@nid int)
    returns nvarchar(1000)
    as
    begin
        declare @s nvarchar(1000),@npid int
        select @s=rtrim(ccategory),@npid=npid from isc_catalog where nid=@nid
        if @s is null
            return null
        
        return isnull(dbo.F_test(@npid)+',','')+@s --用,分隔
        --@s+isnull('.'+dbo.F_test(@npid),'')
    end
    go--加一个分隔函数:
    create  function F_split(
                    @s varchar(8000),          --包含多个数据项的字符串
                    @pos int,                 --要获取的数据项的位置
                    @split varchar(10)        --数据分隔符
    )RETURNS varchar(100)
    AS
    BEGIN
        IF @s IS NULL RETURN(NULL)
        DECLARE @splitlen int                --分隔符长度
        SELECT @splitlen=LEN(@split+'a')-2
        WHILE @pos>1 AND charindex(@split,@s+@split)>0
            SELECT @pos=@pos-1,
                @s=stuff(@s,1,charindex(@split,@s+@split)+@splitlen,'')
        RETURN(nullif(left(@s,charindex(@split,@s+@split)-1),''))
    END
    GOselect 
        dbo.F_split(dbo.F_test(nid),1,','),
        coalesce(dbo.F_split(dbo.F_test(nid),2,','),dbo.F_split(dbo.F_test(nid),1,',')),
        coalesce(dbo.F_split(dbo.F_test(nid),3,','),dbo.F_split(dbo.F_test(nid),2,',')),
        coalesce(dbo.F_split(dbo.F_test(nid),4,','),dbo.F_split(dbo.F_test(nid),3,','),dbo.F_split(dbo.F_test(nid),2,',')),
        coalesce(dbo.F_split(dbo.F_test(nid),5,','),dbo.F_split(dbo.F_test(nid),4,','),dbo.F_split(dbo.F_test(nid),3,','),dbo.F_split(dbo.F_test(nid),2,','))  
    from 
        isc_catalog a  
    where 
        not exists(select 1 from isc_catalog where npid=a.nid)/*
    中国    湖南省    长沙市    雨花区    雨花区
    中国    湖南省    娄底市    娄底市    娄底市
    中国    北京市    北京市    北京市    北京市
    中国    广东省    广州市    白云区    白云小区A
    */--drop function F_split,F_test
    --drop table isc_catalog
      

  3.   

    -------------------------------------
    --  Author : liangCK 梁爱兰
    --  Comment: 小梁 爱 兰儿
    --  Date   : 2009-09-14 10:36:47
    -------------------------------------
     
    --> 生成测试数据: @tb
    DECLARE @tb TABLE (id INT,name VARCHAR(12),parentid INT)
    INSERT INTO @tb
    SELECT 10001,'路容保洁',10000 UNION ALL
    SELECT 10002,'路面',10000 UNION ALL
    SELECT 10003,'路基',10000 UNION ALL
    SELECT 10004,'桥隧涵',10000 UNION ALL
    SELECT 10005,'沿线设施',10000 UNION ALL
    SELECT 10006,'机电设施',10000 UNION ALL
    SELECT 10007,'绿化',10000 UNION ALL
    SELECT 10008,'机械保洁',10001 UNION ALL
    SELECT 10009,'人工保洁',10001 UNION ALL
    SELECT 10010,'偶然事件',10001 UNION ALL
    SELECT 10011,'沥青砼路面',10002 UNION ALL
    SELECT 10012,'水泥砼路面',10002 UNION ALL
    SELECT 10013,'附属构造物',10002 UNION ALL
    SELECT 10014,'路基防护',10003 UNION ALL
    SELECT 10015,'路基水毁',10003 UNION ALL
    SELECT 10016,'路基排水',10003 UNION ALL
    SELECT 10017,'桥梁',10004 UNION ALL
    SELECT 10018,'涵洞',10004 UNION ALL
    SELECT 10019,'隧道',10004 UNION ALL
    SELECT 10020,'管理设施',10005 UNION ALL
    SELECT 10021,'安全防护设施',10005 UNION ALL
    SELECT 10022,'其他设施',10005 UNION ALL
    SELECT 10023,'桥面铺装',10017 UNION ALL
    SELECT 10024,'排水系统',10017 UNION ALL
    SELECT 10025,'附属设施',10017 UNION ALL
    SELECT 10026,'伸缩缝',10017 UNION ALL
    SELECT 10027,'翼墙锥坡',10017 UNION ALL
    SELECT 10028,'墩台',10017 UNION ALL
    SELECT 10029,'台帽盖梁',10017 UNION ALL
    SELECT 10030,'梁式构件',10017 UNION ALL
    SELECT 10031,'桥与路连接',10017--SQL查询如下:;WITH Liang AS
    (
        SELECT *,PATH = CONVERT(varchar(MAX),name),level = 1
        FROM @tb AS A
        WHERE NOT EXISTS(SELECT * FROM @tb WHERE A.parentid = id)
        UNION ALL
        SELECT A.*,CONVERT(varchar(MAX),B.PATH + '->' + A.name),level+1
        FROM @tb AS A
            JOIN Liang AS B
        ON A.parentid = B.id
    )
    SELECT TOP 1 WITH TIES * FROM Liang AS A
    ORDER BY level DESC/*
    id          name         parentid    PATH                    level
    ----------- ------------ ----------- ----------------- -----------
    10023       桥面铺装         10017       桥隧涵->桥梁->桥面铺装    3
    10024       排水系统         10017       桥隧涵->桥梁->排水系统    3
    10025       附属设施         10017       桥隧涵->桥梁->附属设施    3
    10026       伸缩缝          10017       桥隧涵->桥梁->伸缩缝       3
    10027       翼墙锥坡         10017       桥隧涵->桥梁->翼墙锥坡    3
    10028       墩台           10017       桥隧涵->桥梁->墩台          3
    10029       台帽盖梁         10017       桥隧涵->桥梁->台帽盖梁    3
    10030       梁式构件         10017       桥隧涵->桥梁->梁式构件    3
    10031       桥与路连接        10017       桥隧涵->桥梁->桥与路连接  3(9 行受影响)
    */
      

  4.   

    liangCK   --SQL查询如下:;WITH Liang AS
    (
        SELECT *,PATH = CONVERT(varchar(MAX),name),level = 1
        FROM @tb AS A
        WHERE NOT EXISTS(SELECT * FROM @tb WHERE A.parentid = id)
        UNION ALL
        SELECT A.*,CONVERT(varchar(MAX),B.PATH + '->' + A.name),level+1
        FROM @tb AS A
            JOIN Liang AS B
        ON A.parentid = B.id
    )
    SELECT TOP 1 WITH TIES * FROM Liang AS A
    ORDER BY level DESC
    是不是 少点东西呀?
    有QQ吗 加 我 QQ :263306005  在帖子中我只能回复三次
      

  5.   

    先得到通过孩子找爷爷的表(2005)下with cte as
    (
      select id,pid,name,0 as order from tb a where not exists
         (select * from tb where pid=a.id)
      union all
      select id,pid,name,order+1 from tb a join cte b on b.pid=a.id
    )
      

  6.   

    没有语句不全..
    如果是SQL SERVER 2005可以直接使用上面的代码.
    如果是SQL SERVER 2000,则不可以.
      

  7.   

    create   table   isc_catalog(nid   int,     ccategory   VARchar(100),npid   int) 
    INSERT INTO isc_catalog
    SELECT 10001 ,'路容保洁', 10000 UNION ALL
    SELECT 10002 ,'路面', 10000 UNION ALL
    SELECT 10003 ,'路基', 10000 UNION ALL
    SELECT 10004 ,'桥隧涵', 10000 UNION ALL
    SELECT 10005 ,'沿线设施', 10000 UNION ALL
    SELECT 10006 ,'机电设施', 10000 UNION ALL
    SELECT 10007 ,'绿化', 10000 UNION ALL
    SELECT 10008 ,'机械保洁', 10001 UNION ALL
    SELECT 10009 ,'人工保洁', 10001 UNION ALL
    SELECT 10010 ,'偶然事件', 10001 UNION ALL
    SELECT 10011 ,'沥青砼路面', 10002 UNION ALL
    SELECT 10012 ,'水泥砼路面', 10002 UNION ALL
    SELECT 10013 ,'附属构造物', 10002 UNION ALL
    SELECT 10014 ,'路基防护', 10003 UNION ALL
    SELECT 10015 ,'路基水毁', 10003 UNION ALL
    SELECT 10016 ,'路基排水', 10003 UNION ALL
    SELECT 10017 ,'桥梁', 10004 UNION ALL
    SELECT 10018 ,'涵洞', 10004 UNION ALL
    SELECT 10019 ,'隧道', 10004 UNION ALL
    SELECT 10020 ,'管理设施', 10005 UNION ALL
    SELECT 10021 ,'安全防护设施', 10005 UNION ALL
    SELECT 10022 ,'其他设施', 10005 UNION ALL
    SELECT 10023 ,'桥面铺装', 10017 UNION ALL
    SELECT 10024 ,'排水系统', 10017 UNION ALL
    SELECT 10025 ,'附属设施', 10017 UNION ALL
    SELECT 10026 ,'伸缩缝', 10017 UNION ALL
    SELECT 10027 ,'翼墙锥坡', 10017 UNION ALL
    SELECT 10028 ,'墩台', 10017 UNION ALL
    SELECT 10029 ,'台帽盖梁', 10017 UNION ALL
    SELECT 10030 ,'梁式构件', 10017 UNION ALL
    SELECT 10031 ,'桥与路连接', 10017 
    go
    create  function F_test(@nid int)
    returns nvarchar(1000)
    as
    begin
        declare @s nvarchar(1000),@npid int
        select @s=rtrim(ccategory),@npid=npid from isc_catalog where nid=@nid
        if @s is null
            return null
        
        return isnull(dbo.F_test(@npid)+'-','')+@s --用-分隔
        --@s+isnull('.'+dbo.F_test(@npid),'')
    end
    go--加一个分隔函数:
    create  function F_split(
                    @s varchar(8000),          --包含多个数据项的字符串
                    @pos int,                 --要获取的数据项的位置
                    @split varchar(10)        --数据分隔符
    )RETURNS varchar(100)
    AS
    BEGIN
        IF @s IS NULL RETURN(NULL)
        DECLARE @splitlen int                --分隔符长度
        SELECT @splitlen=LEN(@split+'a')-2
        WHILE @pos>1 AND charindex(@split,@s+@split)>0
            SELECT @pos=@pos-1,
                @s=stuff(@s,1,charindex(@split,@s+@split)+@splitlen,'')
        RETURN(nullif(left(@s,charindex(@split,@s+@split)-1),''))
    END
    GOselect 
        dbo.F_split(dbo.F_test(nid),1,'-'),
        coalesce(dbo.F_split(dbo.F_test(nid),2,'-'),dbo.F_split(dbo.F_test(nid),1,'-')),
        coalesce(dbo.F_split(dbo.F_test(nid),3,'-'),dbo.F_split(dbo.F_test(nid),2,'-')),
        coalesce(dbo.F_split(dbo.F_test(nid),4,'-'),dbo.F_split(dbo.F_test(nid),3,'-'),dbo.F_split(dbo.F_test(nid),2,'-')),
        coalesce(dbo.F_split(dbo.F_test(nid),5,'-'),dbo.F_split(dbo.F_test(nid),4,'-'),dbo.F_split(dbo.F_test(nid),3,'-'),dbo.F_split(dbo.F_test(nid),2,'-'))  
    from 
        isc_catalog a  
    where 
        not exists(select 1 from isc_catalog where npid=a.nid)
    AND coalesce(dbo.F_split(dbo.F_test(nid),3,'-'),dbo.F_split(dbo.F_test(nid),2,'-')) IS NOT NULL
    AND coalesce(dbo.F_split(dbo.F_test(nid),3,'-'),dbo.F_split(dbo.F_test(nid),2,'-'))<>
    coalesce(dbo.F_split(dbo.F_test(nid),2,'-'),dbo.F_split(dbo.F_test(nid),1,'-'))/*
    桥隧涵 桥梁 桥面铺装 桥面铺装 桥面铺装
    桥隧涵 桥梁 排水系统 排水系统 排水系统
    桥隧涵 桥梁 附属设施 附属设施 附属设施
    桥隧涵 桥梁 伸缩缝 伸缩缝 伸缩缝
    桥隧涵 桥梁 翼墙锥坡 翼墙锥坡 翼墙锥坡
    桥隧涵 桥梁 墩台 墩台 墩台
    桥隧涵 桥梁 台帽盖梁 台帽盖梁 台帽盖梁
    桥隧涵 桥梁 梁式构件 梁式构件 梁式构件
    桥隧涵 桥梁 桥与路连接 桥与路连接 桥与路连接
    */drop function F_split,F_test
    drop table isc_catalog
      

  8.   

    如果我的数据表 已经存在  --SQL查询如下: ;WITH Liang AS 

        SELECT *,PATH = CONVERT(varchar(MAX),name),level = 1 
        FROM @tb AS A 
        WHERE NOT EXISTS(SELECT * FROM @tb WHERE A.parentid = id) 
        UNION ALL 
        SELECT A.*,CONVERT(varchar(MAX),B.PATH + '->' + A.name),level+1 
        FROM @tb AS A 
            JOIN Liang AS B 
        ON A.parentid = B.id 

    SELECT TOP 1 WITH TIES * FROM Liang AS A 
    ORDER BY level DESC 
    上边一段  ;WITH Liang AS  我看不明白
      

  9.   

    guguda2008   你写的哪个不是我要的  liangCK 写的是我要的~!
      

  10.   


    WITH BT_Category AS
    (
    SELECT *,CategoryName = CONVERT(varchar(MAX),CategoryName),level = 1
        FROM BT_Category AS A
        WHERE NOT EXISTS(SELECT * FROM BT_Category WHERE A.FCategoryCode = CategoryCode)
        UNION ALL
        SELECT A.*,CONVERT(varchar(MAX),B.CategoryName + '->' + A.CategoryName),level+1
        FROM BT_Category AS A inner
            JOIN BT_Category AS B
        ON A.FCategoryCode = B.CategoryCode
    )
    SELECT TOP 1 WITH TIES * FROM BT_Category AS A
    ORDER BY level DESC
    消息 246,级别 16,状态 1,第 2 行
    没有为递归查询 "BT_Category" 指定任何定位点成员。
      

  11.   

    WITH 名称.这个名称不要和你的表同名.
      

  12.   

    WITH Liang AS
    (
        SELECT *,CategoryName = CONVERT(varchar(MAX),CategoryName),level = 1
        FROM BT_Category AS A
        WHERE NOT EXISTS(SELECT * FROM BT_Category WHERE A.FCategoryCode = CategoryCode)
        UNION ALL
        SELECT A.*,CONVERT(varchar(MAX),B.CategoryName + '->' + A.CategoryName),level+1
        FROM BT_Category AS A
            JOIN Liang AS B
        ON A.FCategoryCode = B.CategoryCode)
    SELECT TOP 1 WITH TIES * FROM Liang AS A
    ORDER BY level DESC/*
    id          name         parentid    PATH                    level
    ----------- ------------ ----------- ----------------- -----------
    10023       桥面铺装         10017       桥梁->桥面铺装    4
    10024       排水系统         10017       桥梁->排水系统    4
    10025       附属设施         10017       桥梁->附属设施    4
    10026       伸缩缝           10017       桥梁->伸缩缝     4
    10027       翼墙锥坡         10017       桥梁->翼墙锥坡    4
    10028       墩台             10017       桥梁->墩台          4
    10029       台帽盖梁         10017       桥梁->台帽盖梁    4
    10030       梁式构件         10017       桥梁->梁式构件    4
    10031       桥与路连接       10017       桥梁->桥与路连接  4(9 行受影响)
    */结果 和你的 不一样  这是为什么???