Id PID NodeText NodeSort SID LeveNodel
2 1 技术中心 02 00010002 1 ----技术中心
233 2 技术部 07 000100020233 2 --------技术部
236 233 技术研究科 01 0001000202330236 3 ------------技术研究科
237 233 技术一科 02 0001000202330237 3 ------------技术一科
238 233 技术二科 03 0001000202330238 3 ------------技术二科
239 233 技术三科 04 0001000202330239 3 ------------技术三科
240 233 技术四科 05 0001000202330240 3 ------------技术四科
242 233 技术六科 07 0001000202330242 3 ------------技术六科
243 233 技术七科 08 0001000202330243 3 ------------技术七科
244 233 设计科 09 0001000202330244 3 ------------设计科
3 1 上海公司 03 00010003 1 ----上海公司
4 1 北京公司 04 00010004 1 ----北京公司
5 1 南京公司 05 00010005 1 ----南京公司
6 1 重庆公司 06 00010006 1 ----重庆公司
7 1 广州公司 07 00010007 1 ----广州公司
8 1 合肥公司 08 00010008 1 ----合肥公司
9 1 成都公司 09 00010009 1 ----成都公司
10 1 桂林公司 10 00010010 1 ----桂林公司
11 1 总部 01 00010011 1 ----总部
36 11 人力资源部 05 000100110036 2 --------人力资源部
38 11 采购部 03 000100110038 2 --------采购部如何查询才能得到:(即:以NodeSort为第一排序,这个例子就是要把“总部”及其子节点按照NodeSort提前显示)Id PID NodeText NodeSort SID LeveNodel
11 1 总部 01 00010011 1 ----总部
38 11 采购部 03 000100110038 2 --------采购部
36 11 人力资源部 05 000100110036 2 --------人力资源部
2 1 技术中心 02 00010002 1 ----技术中心
233 2 技术部 07 000100020233 2 --------技术部
236 233 技术研究科 01 0001000202330236 3 ------------技术研究科
237 233 技术一科 02 0001000202330237 3 ------------技术一科
238 233 技术二科 03 0001000202330238 3 ------------技术二科
239 233 技术三科 04 0001000202330239 3 ------------技术三科
240 233 技术四科 05 0001000202330240 3 ------------技术四科
242 233 技术六科 07 0001000202330242 3 ------------技术六科
243 233 技术七科 08 0001000202330243 3 ------------技术七科
244 233 设计科 09 0001000202330244 3 ------------设计科
3 1 上海公司 03 00010003 1 ----上海公司
4 1 北京公司 04 00010004 1 ----北京公司
5 1 南京公司 05 00010005 1 ----南京公司
6 1 重庆公司 06 00010006 1 ----重庆公司
7 1 广州公司 07 00010007 1 ----广州公司
8 1 合肥公司 08 00010008 1 ----合肥公司
9 1 成都公司 09 00010009 1 ----成都公司
10 1 桂林公司 10 00010010 1 ----桂林公司

解决方案 »

  1.   

    8.1.2 树形数据分级汇总示例.sql
    --测试数据
    DECLARE @a TABLE(No varchar(10),Name varchar(10))
    INSERT @a SELECT '101'  ,'现金'
    UNION ALL SELECT '102'  ,'银行存款'
    UNION ALL SELECT '10201','工行'
    UNION ALL SELECT '10202','建行'
    UNION ALL SELECT '10203','农行'DECLARE @b TABLE(No varchar(10),[Money] money )
    INSERT @b SELECT '101'  ,100
    UNION ALL SELECT '10201',20
    UNION ALL SELECT '10202',120--逐级汇总查询
    SELECT a.No,a.Name,
            [Money]=ISNULL(SUM([Money]),0)
    FROM @a a
            LEFT JOIN @b b ON b.No LIKE a.No+'%'
    GROUP BY a.No,a.Name
    ORDER BY a.No
    /*--结果
    No         Name        Money 
    ---------------- ----------------- --------------------- 
    101        现金         100.0000
    102        银行存款     140.0000
    10201      工行         20.0000
    10202      建行         120.0000
    10203      农行         .0000
    --*/      
     8.1.3 树形数据编号重排的通用存储过程.sql--重排编码的存储过程
    CREATE PROC p_RTaxisCode
    @TableName sysname,    --重排编码的表名
    @FieldName sysname,    --编码字段名
    @CodeRule varchar(100)  --以逗号分隔的编码规则,每层编码的长度,比如1,2,3,表示有三层编码,第一层长度为1,第二层长度为2,第三层长度为3
    AS
    --参数检查
    IF ISNULL(OBJECTPROPERTY(OBJECT_ID(@TableName),N'IsUserTable'),0)=0
    BEGIN
            RAISERROR(N'"%s"不存在,或者不是用户表',1,16,@TableName)
            RETURN
    END
    IF NOT EXISTS(SELECT * FROM SYSCOLUMNS WHERE ID=OBJECT_ID(@TableName) AND name=@FieldName)
    BEGIN
            RAISERROR(N'列名"%s"在用户表"%s"中无效',1,16,@FieldName,@TableName)
            RETURN        
    END
    IF ISNULL(@CodeRule,'')=''
    BEGIN
            RAISERROR(N'必须编码规则字符串',1,16)
            RETURN        
    END
    IF PATINDEX(N'%[^0-9^,]%',@CodeRule)>0
    BEGIN
            RAISERROR(N'编码规则字符串"%s"中只能包含数字和逗号(,)',1,16,@CodeRule)
            RETURN        
    END--生成编码重排处理语句
    DECLARE @s nvarchar(4000),@len int,@lens int
    SELECT 
            @TableName=QUOTENAME(@TableName),
            @FieldName=QUOTENAME(@FieldName),
            @len=LEFT(@CodeRule,CHARINDEX(N',',@CodeRule+N',')-1),
            @lens=@len,
            @CodeRule=STUFF(@CodeRule,1,CHARINDEX(N',',@CodeRule+N','),N'')+N',',
            @s=N'RIGHT('+CAST(POWER(10,@len) as varchar)
                    +N'+(SELECT COUNT(DISTINCT '+@FieldName
                    +N') FROM '+@TableName
                    +N' WHERE '+@FieldName+N'<=a.'+@FieldName
                    +N' AND LEN('+@FieldName+N')='+CAST(@len as varchar)
                    +N'),'+CAST(@len as varchar)+N')'WHILE LEN(@CodeRule)>1
    BEGIN
            SELECT 
                    @len=LEFT(@CodeRule,CHARINDEX(N',',@CodeRule)-1),
                    @s=@s
                            +N'+CASE WHEN LEN('+@FieldName
                            +N')>'+CAST(@lens as varchar)
                            +N' THEN RIGHT('+CAST(POWER(10,@len) as varchar)
                            +N'+(SELECT COUNT(DISTINCT '+@FieldName
                            +N') FROM '+@TableName
                            +N' WHERE '+@FieldName+N'<=a.'+@FieldName
                            +N' AND '+@FieldName+N' LIKE LEFT(a.'+@FieldName
                            +N','+CAST(@lens as varchar)
                            +N')+'''+REPLICATE(N'_',@len)
                            +N'''),'+CAST(@len as varchar)
                            +N') ELSE '''' END',
                    @lens=@lens+@len,
                    @CodeRule=STUFF(@CodeRule,1,CHARINDEX(N',',@CodeRule),N'')
    END
    EXEC(N'UPDATE a SET '+@FieldName+N'='+@s+N' FROM '+@TableName+N' a')
      #6使用道具  发表于 2006-6-5 22:08   
    8.1.3 树形数据编号重排示例.sql--测试数据
    DECLARE @t TABLE(No varchar(10))
    INSERT @t SELECT '1'
    UNION ALL SELECT '3'
    UNION ALL SELECT '302'
    UNION ALL SELECT '305'
    UNION ALL SELECT '305001'
    UNION ALL SELECT '305005'
    UNION ALL SELECT '6'
    UNION ALL SELECT '601'--重排编码
    UPDATE a SET 
            No=RIGHT(--重排第一层编码
                            (SELECT COUNT(DISTINCT No) FROM @t WHERE No<=a.No AND LEN(No)=1),1)
                    +CASE --重排第二层编码
                            WHEN LEN(No)>1 
                            THEN RIGHT(100+
                                    (SELECT COUNT(DISTINCT No) FROM @t WHERE No<=a.No AND No LIKE LEFT(a.NO,1)+'__'),2)
                            ELSE '' END
                    +CASE --重排第三层编码
                            WHEN LEN(No)>3
                            THEN RIGHT(1000+
                                    (SELECT COUNT(DISTINCT No) FROM @t WHERE No<=a.No AND No LIKE LEFT(a.NO,3)+'___'),3)
                            ELSE '' END
    FROM @t a--显示处理结果
    SELECT * FROM @t
    /*--结果
    No         
    ---------- 
    1
    2
    201
    202
    202001
    202002
    3
    301
    --*/
       
    8.2.2 树形数据层次显示处理示例.sql
    --测试数据
    DECLARE @t TABLE(ID char(3),PID char(3),Name nvarchar(10))
    INSERT @t SELECT '001',NULL ,'山东省'
    UNION ALL SELECT '002','001','烟台市'
    UNION ALL SELECT '004','002','招远市'
    UNION ALL SELECT '003','001','青岛市'
    UNION ALL SELECT '005',NULL ,'四会市'
    UNION ALL SELECT '006','005','清远市'
    UNION ALL SELECT '007','006','小分市'--深度排序显示处理
    --生成每个节点的编码累计(相同当单编号法的编码)
    DECLARE @t_Level TABLE(ID char(3),Level int,Sort varchar(8000))
    DECLARE @Level int
    SET @Level=0
    INSERT @t_Level SELECT ID,@Level,ID
    FROM @t
    WHERE PID IS NULL
    WHILE @@ROWCOUNT>0
    BEGIN
            SET @Level=@Level+1
            INSERT @t_Level SELECT a.ID,@Level,b.Sort+a.ID
            FROM @t a,@t_Level b
            WHERE a.PID=b.ID
                    AND b.Level=@Level-1
    END--显示结果
    SELECT SPACE(b.Level*2)+'|--'+a.Name
    FROM @t a,@t_Level b
    WHERE a.ID=b.ID
    ORDER BY b.Sort
    /*--结果
    |--山东省
      |--烟台市
        |--招远市
      |--青岛市
    |--四会市
      |--清远市
        |--小分市
    --*/
    8.2.2 树形数据广度排序处理示例.sql
    --测试数据
    DECLARE @t TABLE(ID char(3),PID char(3),Name nvarchar(10))
    INSERT @t SELECT '001',NULL ,'山东省'
    UNION ALL SELECT '002','001','烟台市'
    UNION ALL SELECT '004','002','招远市'
    UNION ALL SELECT '003','001','青岛市'
    UNION ALL SELECT '005',NULL ,'四会市'
    UNION ALL SELECT '006','005','清远市'
    UNION ALL SELECT '007','006','小分市'--广度排序显示处理
    --生成每个节点的层次数据
    DECLARE @t_Level TABLE(ID char(3),Level int)
    DECLARE @Level int
    SET @Level=0
    INSERT @t_Level SELECT ID,@Level
    FROM @t
    WHERE PID IS NULL
    WHILE @@ROWCOUNT>0
    BEGIN
            SET @Level=@Level+1
            INSERT @t_Level SELECT a.ID,@Level
            FROM @t a,@t_Level b
            WHERE a.PID=b.ID
                    AND b.Level=@Level-1
    END--显示结果
    SELECT a.*
    FROM @t a,@t_Level b
    WHERE a.ID=b.ID
    ORDER BY b.Level,b.ID
    /*--结果
    ID   PID  Name       
    ------- --------- ---------- 
    001  NULL 山东省
    005  NULL 四会市
    002  001   烟台市
    003  001   青岛市
    006  005   清远市
    004  002   招远市
    007  006   小分市
    --*/
    8.2.2 树形数据深度排序处理示例(递归法).sql
    --测试数据
    CREATE TABLE tb(ID char(3),PID char(3),Name nvarchar(10))
    INSERT tb SELECT '001',NULL ,'山东省'
    UNION ALL SELECT '002','001','烟台市'
    UNION ALL SELECT '004','002','招远市'
    UNION ALL SELECT '003','001','青岛市'
    UNION ALL SELECT '005',NULL ,'四会市'
    UNION ALL SELECT '006','005','清远市'
    UNION ALL SELECT '007','006','小分市'
    GO--广度搜索排序函数
    CREATE FUNCTION f_Sort(@ID char(3)=NULL,@sort int=1)
    RETURNS @t_Level TABLE(ID char(3),sort int)
    AS
    BEGIN
            DECLARE tb CURSOR LOCAL
            FOR
            SELECT ID FROM tb
            WHERE PID=@ID
                    OR(@ID IS NULL AND PID IS NULL)
            OPEN TB
            FETCH tb INTO @ID
            WHILE @@FETCH_STATUS=0
            BEGIN
                    INSERT @t_Level VALUES(@ID,@sort)
                    SET @sort=@sort+1
                    IF @@NESTLEVEL<32 --如果递归层数未超过32层(递归最大允许32层)
                    BEGIN
                            --递归查找当前节点的子节点
                            INSERT @t_Level SELECT * FROM f_Sort(@ID,@sort)
                            SET @sort=@sort+@@ROWCOUNT  --排序号加上子节点个数
                    END
                    FETCH tb INTO @ID
            END
            RETURN
    END
    GO--显示结果
    SELECT a.*
    FROM tb a,f_Sort(DEFAULT,DEFAULT) b
    WHERE a.ID=b.ID
    ORDER BY b.sort
    /*--结果
    ID   PID   Name       
    ------ --------- ---------- 
    001  NULL 山东省
    002  001   烟台市
    004  002   招远市
    003  001   青岛市
    005  NULL 四会市
    006  005   清远市
    007  006   小分市
    --*/
    8.2.2 树形数据深度排序处理示例(模拟单编号法).sql--测试数据
    DECLARE @t TABLE(ID char(3),PID char(3),Name nvarchar(10))
    INSERT @t SELECT '001',NULL ,'山东省'
    UNION ALL SELECT '002','001','烟台市'
    UNION ALL SELECT '004','002','招远市'
    UNION ALL SELECT '003','001','青岛市'
    UNION ALL SELECT '005',NULL ,'四会市'
    UNION ALL SELECT '006','005','清远市'
    UNION ALL SELECT '007','006','小分市'--深度排序显示处理
    --生成每个节点的编码累计(相同当单编号法的编码)
    DECLARE @t_Level TABLE(ID char(3),Level int,Sort varchar(8000))
    DECLARE @Level int
    SET @Level=0
    INSERT @t_Level SELECT ID,@Level,ID
    FROM @t
    WHERE PID IS NULL
    WHILE @@ROWCOUNT>0
    BEGIN
            SET @Level=@Level+1
            INSERT @t_Level SELECT a.ID,@Level,b.Sort+a.ID
            FROM @t a,@t_Level b
            WHERE a.PID=b.ID
                    AND b.Level=@Level-1
    END--显示结果
    SELECT a.*
    FROM @t a,@t_Level b
    WHERE a.ID=b.ID
    ORDER BY b.Sort
    /*--结果
    ID   PID   Name       
    ------ --------- ---------- 
    001  NULL 山东省
    002  001   烟台市
    004  002   招远市
    003  001   青岛市
    005  NULL 四会市
    006  005   清远市
    007  006   小分市
    --*/
     
     
      

  2.   

    哎,觉得CSDN的这个编辑框不好,找个可以插入表格的编辑框,显示效果才会好一些
      

  3.   

    楼上没有明白我的要求,我这个就是从邹老大的东东之后得到的结果。我还要再按照nodesort排序一下
      

  4.   

    ----------------------------------BOM算法
    --产品配件清单查询示例(邹建)
    CREATE TABLE Item(ID int,Name varchar(10),Wast decimal(2,2))
    INSERT Item SELECT 1,N'A产品',0.01
    UNION  ALL  SELECT 2,N'B产品',0.02
    UNION  ALL  SELECT 3,N'C产品',0.10
    UNION  ALL  SELECT 4,N'D配件',0.15
    UNION  ALL  SELECT 5,N'E物料',0.03
    UNION  ALL  SELECT 6,N'F物料',0.01
    UNION  ALL  SELECT 7,N'G配件',0.02CREATE TABLE Bom(ItemID int,ChildId int)
    INSERT Bom SELECT 1,4
    UNION  ALL SELECT 1,7   --A产品由D配件和G配件组成
    UNION  ALL SELECT 2,1
    UNION  ALL SELECT 2,6
    UNION  ALL SELECT 2,7   --B产品由F物料及G配件组成
    UNION  ALL SELECT 4,5
    UNION  ALL SELECT 4,6    --D配件由F物料组成
    UNION  ALL SELECT 3,2
    UNION  ALL SELECT 3,1    --C产品由A产品和B产品组成
    GOCREATE FUNCTION f_Bom(
    @ItemIDs varchar(1000), --要查询物料清单及生产量的产品编号列表(逗号分隔)
    @Num   int          --要生产的数量
    )RETURNS @t TABLE(ItemID int,ChildId int,Nums int,Level int)
    AS
    BEGIN
        DECLARE @Level int
        SET @Level=1
        INSERT @t SELECT a.ItemID,a.ChildId,ROUND(@Num/(1-b.Wast),0),@Level
        FROM Bom a,Item b
        WHERE a.ChildId=b.ID
            AND CHARINDEX(','+RTRIM(a.ItemID)+',',','+@ItemIDs+',')>0
        WHILE @@ROWCOUNT>0 and @Level<140
        BEGIN
            SET @Level=@Level+1
            INSERT @t SELECT a.ItemID,b.ChildId,ROUND(a.Nums/(1-c.Wast),0),@Level
            FROM @t a,Bom b,Item c
            WHERE a.ChildId=b.ItemID
                AND b.ChildId=c.ID
                AND a.Level=@Level-1
        END
        RETURN
    END
    GO--调用函数展开产品1、2、3的结构及计算生产10个产品时,各需要多少个配件
    SELECT a.ItemID,ItemName=b.Name,
        a.ChildId,ChildName=c.Name,
        a.Nums,a.Level
    FROM f_Bom('1,2,3',10) a,Item b,Item c
    WHERE a.ItemID=b.ID
        AND a.ChildId=c.ID
    ORDER BY a.ItemID,a.Level,a.ChildId/*
    ItemID      ItemName   ChildId     ChildName  Nums        Level
    ----------- ---------- ----------- ---------- ----------- -----------
    1           A产品        4           D配件        12          1
    1           A产品        7           G配件        10          1
    1           A产品        5           E物料        12          2
    1           A产品        6           F物料        12          2
    2           B产品        1           A产品        10          1
    2           B产品        6           F物料        10          1
    2           B产品        7           G配件        10          1
    2           B产品        4           D配件        12          2
    2           B产品        7           G配件        10          2
    2           B产品        5           E物料        12          3
    2           B产品        6           F物料        12          3
    3           C产品        1           A产品        10          1
    3           C产品        2           B产品        10          1
    3           C产品        1           A产品        10          2
    3           C产品        4           D配件        12          2
    3           C产品        6           F物料        10          2
    3           C产品        7           G配件        10          2
    3           C产品        7           G配件        10          2
    3           C产品        4           D配件        12          3
    3           C产品        5           E物料        12          3
    3           C产品        6           F物料        12          3
    3           C产品        7           G配件        10          3
    3           C产品        5           E物料        12          4
    3           C产品        6           F物料        12          4(24 row(s) affected)
    */
    drop table item
    drop table bom
    drop function f_Bom
      

  5.   

    -------------------------------------------------------------
    --测试数据
    CREATE TABLE tb(ID char(3),PID char(3),Name nvarchar(10))
    INSERT tb SELECT '001',NULL ,'山东省'
    UNION ALL SELECT '002','001','烟台市'
    UNION ALL SELECT '004','002','招远市'
    UNION ALL SELECT '003','001','青岛市'
    UNION ALL SELECT '005',NULL ,'四会市'
    UNION ALL SELECT '006','005','清远市'
    UNION ALL SELECT '007','006','小分市'
    GO--查询指定节点及其所有子节点的函数
    CREATE FUNCTION f_Cid(@ID char(3))
    RETURNS @t_Level TABLE(ID char(3),Level int)
    AS
    BEGIN
        DECLARE @Level int
        SET @Level=1
        INSERT @t_Level SELECT @ID,@Level
        WHILE @@ROWCOUNT>0
        BEGIN
            SET @Level=@Level+1
            INSERT @t_Level SELECT a.ID,@Level
            FROM tb a,@t_Level b
            WHERE a.PID=b.ID
                AND b.Level=@Level-1
        END
        RETURN
    END
    GO--调用函数查询002及其所有子节点
    SELECT a.*
    FROM tb a,f_Cid('002') b
    WHERE a.ID=b.ID
    /*--结果
    ID   PID  Name       
    ------ ------- ---------- 
    002  001  烟台市
    004  002  招远市
    --*/
      

  6.   

    create table tb(id varchar(3) , pid varchar(3) , name varchar(10)) 
    insert into tb values('001' , null  , '广东省') 
    insert into tb values('002' , '001' , '广州市') 
    insert into tb values('003' , '001' , '深圳市') 
    insert into tb values('004' , '002' , '天河区') 
    insert into tb values('005' , '003' , '罗湖区') 
    insert into tb values('006' , '003' , '福田区') 
    insert into tb values('007' , '003' , '宝安区') 
    insert into tb values('008' , '007' , '西乡镇') 
    insert into tb values('009' , '007' , '龙华镇') 
    insert into tb values('010' , '007' , '松岗镇') 
    go --查询指定节点及其所有子节点的函数 
    create function f_cid(@ID varchar(3)) returns @t_level table(id varchar(3) , level int) 
    as 
    begin 
      declare @level int 
      set @level = 1 
      insert into @t_level select @id , @level 
      while @@ROWCOUNT > 0 
      begin 
        set @level = @level + 1 
        insert into @t_level select a.id , @level 
        from tb a , @t_Level b 
        where a.pid = b.id and b.level = @level - 1 
      end 
      return 
    end 
    go --调用函数查询001(广东省)及其所有子节点 
    select a.* from tb a , f_cid('001') b where a.id = b.id order by a.id 
    /* 
    id  pid  name      
    ---- ---- ---------- 
    001  NULL 广东省 
    002  001  广州市 
    003  001  深圳市 
    004  002  天河区 
    005  003  罗湖区 
    006  003  福田区 
    007  003  宝安区 
    008  007  西乡镇 
    009  007  龙华镇 
    010  007  松岗镇 (所影响的行数为 10 行) 
    */ --调用函数查询002(广州市)及其所有子节点 
    select a.* from tb a , f_cid('002') b where a.id = b.id order by a.id 
    /* 
    id  pid  name      
    ---- ---- ---------- 
    002  001  广州市 
    004  002  天河区 (所影响的行数为 2 行) 
    */ --调用函数查询003(深圳市)及其所有子节点 
    select a.* from tb a , f_cid('003') b where a.id = b.id order by a.id 
    /* 
    id  pid  name      
    ---- ---- ---------- 
    003  001  深圳市 
    005  003  罗湖区 
    006  003  福田区 
    007  003  宝安区 
    008  007  西乡镇 
    009  007  龙华镇 
    010  007  松岗镇 (所影响的行数为 7 行) 
    */ drop table tb 
    drop function f_cid
      

  7.   

    各位老大。我要的是这个需求:
    http://www.profluid.com.cn/sql000.htm
    http://www.profluid.com.cn/sql000.htm
      

  8.   

    哎,强烈质疑自己的表达能力ing
      

  9.   

    ------------------------------------------------
    --  Author : liangCK 小梁 & angellan 兰儿
    --  Comment: 小梁 爱 兰儿
    --  Date   : 2008-10-05 09:23:59
    ------------------------------------------------
     
    --> 生成测试数据: @T
    DECLARE @T TABLE (Id INT,PID INT,NodeText VARCHAR(10),NodeSort VARCHAR(2),SID VARCHAR(16),LeveNodel INT)
    INSERT INTO @T
    SELECT 2,1,'技术中心','02','00010002',1 UNION ALL
    SELECT 233,2,'技术部','07','000100020233',2 UNION ALL
    SELECT 236,233,'技术研究科','01','0001000202330236',3 UNION ALL
    SELECT 237,233,'技术一科','02','0001000202330237',3 UNION ALL
    SELECT 238,233,'技术二科','03','0001000202330238',3 UNION ALL
    SELECT 239,233,'技术三科','04','0001000202330239',3 UNION ALL
    SELECT 240,233,'技术四科','05','0001000202330240',3 UNION ALL
    SELECT 242,233,'技术六科','07','0001000202330242',3 UNION ALL
    SELECT 243,233,'技术七科','08','0001000202330243',3 UNION ALL
    SELECT 244,233,'设计科','09','0001000202330244',3 UNION ALL
    SELECT 3,1,'上海公司','03','00010003',1 UNION ALL
    SELECT 4,1,'北京公司','04','00010004',1 UNION ALL
    SELECT 5,1,'南京公司','05','00010005',1 UNION ALL
    SELECT 6,1,'重庆公司','06','00010006',1 UNION ALL
    SELECT 7,1,'广州公司','07','00010007',1 UNION ALL
    SELECT 8,1,'合肥公司','08','00010008',1 UNION ALL
    SELECT 9,1,'成都公司','09','00010009',1 UNION ALL
    SELECT 10,1,'桂林公司','10','00010010',1 UNION ALL
    SELECT 11,1,'总部','01','00010011',1 UNION ALL
    SELECT 36,11,'人力资源部','05','000100110036',2 UNION ALL
    SELECT 38,11,'采购部','03','000100110038',2--SQL查询如下:;WITH LanLoveLiang AS
    (
        SELECT *,
            rowid=CAST(ROW_NUMBER() OVER(ORDER BY PID,NodeSort) AS VARBINARY(MAX))
        FROM @T AS A
        WHERE NOT EXISTS(SELECT * FROM @T
                         WHERE A.PID=ID)
        UNION ALL
        SELECT
            A.*,
            CAST(B.rowid + 
                    CAST(ROW_NUMBER() OVER(ORDER BY A.PID,A.NodeSort) AS BINARY(4)) 
                   AS VARBINARY(MAX))
        FROM @T AS A
            JOIN LanLoveLiang AS B
        ON A.PID = B.Id
    )
    SELECT Id,PID,NodeText,NodeSort,
        SID,LeveNodel
    FROM LanLoveLiang ORDER BY rowid/*
    Id          PID         NodeText   NodeSort SID              LeveNodel
    ----------- ----------- ---------- -------- ---------------- -----------
    11          1           总部         01       00010011         1
    38          11          采购部        03       000100110038     2
    36          11          人力资源部      05       000100110036     2
    2           1           技术中心       02       00010002         1
    233         2           技术部        07       000100020233     2
    236         233         技术研究科      01       0001000202330236 3
    237         233         技术一科       02       0001000202330237 3
    238         233         技术二科       03       0001000202330238 3
    239         233         技术三科       04       0001000202330239 3
    240         233         技术四科       05       0001000202330240 3
    242         233         技术六科       07       0001000202330242 3
    243         233         技术七科       08       0001000202330243 3
    244         233         设计科        09       0001000202330244 3
    3           1           上海公司       03       00010003         1
    4           1           北京公司       04       00010004         1
    5           1           南京公司       05       00010005         1
    6           1           重庆公司       06       00010006         1
    7           1           广州公司       07       00010007         1
    8           1           合肥公司       08       00010008         1
    9           1           成都公司       09       00010009         1
    10          1           桂林公司       10       00010010         1(21 行受影响)*/
      

  10.   

    呵呵,水平很高,但SQL2000没有with用法啊