<menu id="ycqsw"></menu><nav id="ycqsw"><code id="ycqsw"></code></nav>
<dd id="ycqsw"><menu id="ycqsw"></menu></dd>
  • <nav id="ycqsw"></nav>
    <menu id="ycqsw"><strong id="ycqsw"></strong></menu>
    <xmp id="ycqsw"><nav id="ycqsw"></nav>
  • oracle遞歸查詢語句(oracle遞歸查詢函數)


    眾所周知,目前的mysql版本中并不支持直接的遞歸查詢,但是通過遞歸到迭代轉化的思路,還是可以在一句SQL內實現樹的遞歸查詢的。這個得益于Mysql允許在SQL語句內使用@變量。以下是示例代碼。

    創建表格

    CREATE TABLE `lf_ctrl_trade` (
        `TRADEID` int , -- 節點ID
        `nodename` varchar (60), -- 節點名稱
        `PARENTID` int  -- 節點父ID
    ); 

    方案一:

     SELECT TRADEID AS ID,PARENTID AS 父ID ,levels AS 父到子之間級數, paths AS 父到子路徑 FROM (
         SELECT TRADEID,PARENTID,
         @le:= IF (PARENTID = 0 ,0,  
             IF( LOCATE( CONCAT('|',PARENTID,':'),@pathlevel)   > 0  ,      
                      SUBSTRING_INDEX( SUBSTRING_INDEX(@pathlevel,CONCAT('|',PARENTID,':'),-1),'|',1) +1
            ,@le+1) ) levels
         , @pathlevel:= CONCAT(@pathlevel,'|',TRADEID,':', @le ,'|') pathlevel
          , @pathnodes:= IF( PARENTID =0,',0', 
               CONCAT_WS(',',
               IF( LOCATE( CONCAT('|',PARENTID,':'),@pathall) > 0  , 
                   SUBSTRING_INDEX( SUBSTRING_INDEX(@pathall,CONCAT('|',PARENTID,':'),-1),'|',1)
                  ,@pathnodes ) ,PARENTID  ) )paths
        ,@pathall:=CONCAT(@pathall,'|',TRADEID,':', @pathnodes ,'|') pathall 
            FROM  lf_ctrl_trade, 
        (SELECT @le:=0,@pathlevel:='', @pathall:='',@pathnodes:='') vv
        ORDER BY  PARENTID,TRADEID
        ) src
    ORDER BY TRADEID

    方案二:

    創建函數

    DROP FUNCTION IF EXISTS queryChildrenTrade;
    
    CREATE FUNCTION `queryChildrenTrade` (myid INT)
    
    RETURNS VARCHAR(4000)
    
    BEGIN
    
    DECLARE sTemp VARCHAR(4000);
    
    DECLARE sTempChd VARCHAR(4000);
    
     
    
    SET sTemp = '$';
    
    SET sTempChd = cast(myid as char);
    
     
    
    WHILE sTempChd is not NULL DO
    
    SET sTemp = CONCAT(sTemp,',',sTempChd);
    
    SELECT group_concat(TRADEID) INTO sTempChd FROM lf_ctrl_trade where FIND_IN_SET(PARENTID,sTempChd)>0;
    
    END WHILE;
    
    return sTemp;
    
    END;

    如何查詢:

    select * from lf_ctrl_trade where FIND_IN_SET(TRADEID, queryChildrenTrade(3000))

    版權聲明:本文內容由互聯網用戶自發貢獻,該文觀點僅代表作者本人。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。如發現本站有涉嫌抄襲侵權/違法違規的內容, 請發送郵件至 舉報,一經查實,本站將立刻刪除。

    發表評論

    登錄后才能評論
    国产精品区一区二区免费