• 查找指定节点的所有父节点的示例函数


    CREATE FUNCTION f_Pid(@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.PID,@Level  
     
            FROM tb a,@t_Level b  
     
            WHERE a.ID=b.ID  
     
                AND b.Level=@Level-1  
     
        END  
     
        RETURN  
     
    END  
     
    GO  
     
     
     
     
     

     
    CREATE FUNCTION f_Pid(@ID char(3))  
     
    RETURNS @t_Level TABLE(ID char(3))  
     
    AS  
     
    BEGIN  
     
        INSERT @t_Level SELECT @ID  
     
        SELECT @ID=PID FROM tb  
     
        WHERE ID=@ID  
     
            AND PID IS NOT NULL  
     
        WHILE @@ROWCOUNT>0  
     
        BEGIN  
     
            INSERT @t_Level SELECT @ID  
     
            SELECT @ID=PID FROM tb  
     
            WHERE ID=@ID  
     
                AND PID IS NOT NULL  
     
        END  
     
        RETURN  
     
    END  
    </PRE>  
    <PRE class="csharp" name="code"><PRE class="ql" name="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_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   小分市 
     


     

  • 相关阅读:
    贪心算法1000
    贪心算法1006
    1012
    贪心算法1016
    贪心算法1001
    贪心算法1004
    Java作业1
    指针数组与数组指针的区别
    Java 中对类进行排序的方法(转)
    java习题1
  • 原文地址:https://www.cnblogs.com/feihusurfer/p/1762850.html
Copyright © 2020-2023  润新知