--测试数据
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
/*--结果
|--山东省
  |--烟台市
    |--招远市
  |--青岛市
|--四会市
  |--清远市
    |--小分市
--*/上面的Level就是深度.

解决方案 »

  1.   

    发表于:2008-06-06 20:06:17 楼主 
    我先描述一下问题,我是用vb.net写的treeview的遍历 ,将数据库表里的数据填充到treeview的结点上 
    表结构是这样 
    BusinessID Level SponsorID 
    27111618 1 27111608 
    27111617 2 27111618 
    27111675 2 27111618 
    27111676 3 27111675 
    27111527 4 27111676 
    27111682 4 27111676 
    27111692 4 27111676 
    27111723 4 27111676 
    27123212 4 27111676 
    27123228 4 27111676 
    27123240 4 27111676 
    27111454 5 27123240 
    27111457 5 27123240 
    27123254 5 27123240 
    27111683 3 27111675 
    27111468 4 27111683 
    27111530 4 27111683 
    27111664 4 27111683 
    27123236 2 27111618 
    这个表我已经用一个递归实现了  问题是我如何把上面的表转化成下面的表   意思就是我输入某一个businessid  把它的所有子结点都存到一张表里 
    结果应该是这样 
    BusinessID Level SponsorID 
    27111676 1 27111675 
    27111527 2 27111676 
    27111682 2 27111676 
    27111692 2 27111676 
    27111723 2 27111676 
    27123212 2 27111676 
    27123228 2 27111676 
    27123240 2 27111676 
    27111454 3 27123240 
    27111457 3 27123240 
    27123254 3 27123240 
    level是层数  或者叫深度吧   sponsorid 是上线  例如:27111676的sponorid为27111675 那么27111676就是27111675的子结点 利用这个方法已经实现一半了
    SQL code--测试数据
    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  招远市
    --*/用上面的方法第一列和第三列都正确了  只是中间那列的level不是从1 开始的  请问如何处理一下 这下够详细了吧