name      ID    PID 
广东省    888    0
深圳市    853    888
南山区    566    853
罗湖区    588    853
广州市    876    888
越秀区    788    876
天河区    775    876要打印的结果是广东省
-深圳市
--南山区
--罗湖区
-广州市
--越秀区
--天河区 
'-'横杆可以去掉主要是方便大家看,只要按顺序就可以了,请大家帮忙

解决方案 »

  1.   

    --测试数据
    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
    /*--结果
    |--山东省
      |--烟台市
        |--招远市
      |--青岛市
    |--四会市
      |--清远市
        |--小分市
    --*/
      

  2.   

    --> liangCK小梁 于2008-10-11
    --> 生成测试数据: #T
    IF OBJECT_ID('tempdb.dbo.#T') IS NOT NULL DROP TABLE #T
    CREATE TABLE #T (name NVARCHAR(6),ID INT,PID INT)
    INSERT INTO #T
    SELECT '广东省','888','0' UNION ALL
    SELECT '深圳市','853','888' UNION ALL
    SELECT '南山区','566','853' UNION ALL
    SELECT '罗湖区','588','853' UNION ALL
    SELECT '广州市','876','888' UNION ALL
    SELECT '越秀区','788','876' UNION ALL
    SELECT '天河区','775','876'--SQL查询如下:;WITH CTE
    AS
    (
       SELECT name,ID,level=1,
              path=CAST(name AS NVARCHAR(1000))
       FROM #T 
       WHERE PID=0
       
       UNION ALL
       
       SELECT t.name,t.id,c.level+1,
              CAST(c.path+t.name AS NVARCHAR(1000))
       FROM CTE AS c
         JOIN #T AS t
        ON c.ID=t.PID
    )
    SELECT REPLICATE('--',level)+name AS Name
    FROM CTE
    ORDER BY path/*
    Name
    ---------------------
    --广东省
    ----广州市
    ------天河区
    ------越秀区
    ----深圳市
    ------南山区
    ------罗湖区(7 行受影响)*/