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


    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   小分市 
     


     

  • 相关阅读:
    关于Unity中的NavMeshAgent的remainingDistance问题
    关于Unity中MonoBehaviour的构造函数
    【Unity】Domina-Game总结与反思
    初步理解IOC和DI和AOP模式
    简单并查集归纳
    括号匹配-记错心得
    Django博客项目思路整理
    找零问题
    连续子序列最大和的O(NlogN)算法
    Python-demo(photo)
  • 原文地址:https://www.cnblogs.com/feihusurfer/p/1762850.html
Copyright © 2020-2023  润新知