表t1
结构:nodeid;name ;parentid;
求个sql:
已知一个nodeid,查询所有nodeid下级数据,并且列出当前nodeid所在级数(层数)sql 2005和sql 2000的一样吗?通用不通用?

解决方案 »

  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 intSET @Level=0INSERT @t_Level SELECT ID,@Level,IDFROM @tWHERE PID IS NULLWHILE @@ROWCOUNT>0BEGIN    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-1END --显示结果SELECT SPACE(b.Level*2)+'|--'+a.NameFROM @t a,@t_Level bWHERE a.ID=b.IDORDER BY b.Sort/*--结果|--山东省  |--烟台市    |--招远市  |--青岛市|--四会市  |--清远市    |--小分市--*/
    你要的是这种吗
      

  2.   

    --测试数据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 intSET @Level=0INSERT @t_Level SELECT ID,@LevelFROM @tWHERE PID IS NULLWHILE @@ROWCOUNT>0BEGIN    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-1END --显示结果SELECT a.*FROM @t a,@t_Level bWHERE a.ID=b.IDORDER BY b.Level,b.ID/*--结果ID   PID  Name       ------- --------- ---------- 001  NULL 山东省005  NULL 四会市002  001   烟台市003  001   青岛市006  005   清远市004  002   招远市007  006   小分市--*/
      

  3.   


    ;with t as(
    select * from t1 where nodeid='[已知一个nodeid]'
    union all
    select * from t1 inner join t on t1.parentid=t.nodeid
    )
    select row_number() over(order by parentid),* from t;
      

  4.   

    USE tempdb
    GO-- 建立演示环境
    CREATE TABLE Dept(
     id int PRIMARY KEY, 
     parent_id int,
     name nvarchar(20))
    INSERT Dept
    SELECT 0, 0, N'<全部>' UNION ALL
    SELECT 1, 0, N'财务部' UNION ALL
    SELECT 2, 0, N'行政部' UNION ALL
    SELECT 3, 0, N'业务部' UNION ALL
    SELECT 4, 0, N'业务部' UNION ALL
    SELECT 5, 4, N'销售部' UNION ALL
    SELECT 6, 4, N'MIS' UNION ALL
    SELECT 7, 6, N'UI' UNION ALL
    SELECT 8, 6, N'软件开发' UNION ALL
    SELECT 9, 8, N'内部开发'
    GO-- 查询指定部门下面的所有部门
    DECLARE @Dept_name nvarchar(20)
    SET @Dept_name = N'MIS'
    ;WITH
    DEPTS AS(
     -- 定位点成员
     SELECT * FROM Dept
     WHERE name = @Dept_name
     UNION ALL
     -- 递归成员, 通过引用CTE自身与Dept基表JOIN实现递归
     SELECT A.*
     FROM Dept A, DEPTS B
     WHERE A.parent_id = B.id
    )
    SELECT * FROM DEPTS
    GO-- 删除演示环境
    DROP TABLE Dept