数据库递归查询

oracle,mysql递归查询

        • mysql
          • 向下递归查询当前节点下所有子节点
            • 调用方式
          • 向上递归查询所有父节点
            • 调用方式
        • oracle START WITH 用法

oracle递归查询比mysql递归查询要简单的多,oracle中递归只要实现START WITH …CONNECT BY PRIOR …就可以实现,而mysql责需要利用find_in_set()函数和group_concat()函数实现递归查询

mysql

向下递归查询当前节点下所有子节点
--  --递归子节点
CREATE FUNCTION `getChildList`(这里填写函数的名字)(rootId INT)
RETURNS varchar(1000) 
 
BEGIN
    DECLARE sTemp VARCHAR(1000);
    DECLARE sTempChd VARCHAR(1000);
 
    SET sTemp = '$';
    SET sTempChd =cast(rootId as CHAR);
 
    WHILE sTempChd is not null DO
        SET sTemp = concat(sTemp,',',sTempChd);
        SELECT group_concat(sm.ID (子节点id)) INTO sTempChd FROM  sys_menu sm (数据表格) where FIND_IN_SET(sm.PARENTID(父节点),sTempChd)>0;
    END WHILE;
    RETURN sTemp; 
END

调用方式
SELECT * FROM SYS_MENU sm 
 where find_in_set(sm.id,getChildList(父节点id))  ; 
 
向上递归查询所有父节点
--  --递归父节点
 
CREATE FUNCTION `getParList`(方法名)(rootId INT)
RETURNS varchar(1000) 
BEGIN
    DECLARE sTemp VARCHAR(1000);
    DECLARE sTempPar VARCHAR(1000); 
    SET sTemp = ''; 
    SET sTempPar =rootId; 
    WHILE sTempPar is not null DO 
        IF sTemp != '' THEN
            SET sTemp = concat(sTemp,',',sTempPar);
        ELSE
            SET sTemp = sTempPar;
        END IF;
        SET sTemp = concat(sTemp,',',sTempPar); 
        SELECT group_concat(sm.PARENTID(父节点) ) INTO sTempPar FROM sys_menu sm(数据表) where sm.PARENTID(父节点id)<>sm.ID (子节点id) and FIND_IN_SET(sm.ID (子节点id),sTempPar)>0; 
    END WHILE; 
RETURN sTemp; 
END

调用方式
SELECT * FROM SYS_MENU sm 
 where find_in_set(sm.id,getParList(子节点id))  ; 
 

oracle START WITH 用法

SELECT ... FROM    + 表名
WHERE              + 条件3
START WITH         + 条件1
CONNECT BY PRIOR   + 条件2
  • 条件1: 表示从哪个节点开始查找, 也就是通过条件1 查询到的数据, 作为后续查询的起始节点(参数).
    当然可以放宽限定条件,如 ID in (‘00001’, ‘00011’)以取得多个根节点,也就是多棵树;在连接关系中,除了可以使用列明外,还允许使用列表达式。
    如果省略Start With
    就默认把所有满足查询条件的Tree整个表中的数据从头到尾遍历一次,每一个数据做一次根,然后遍历树中其他节点信息.

  • 条件2: 是连接条件,其中用PRIOR表示上一条记录,例如CONNECT BY PRIOR ID = PID,意思就是上一条记录的ID是本条记录的PID,即本记录的父亲是上一条记录。CONNECT BY子句说明每行数据将是按照层次顺序检索,并规定将表中的数据连入树形结构的关系中。
    Prior 在父节点的一侧表示, 自底向上查, 在 子节点的一侧表示 自上向下查询;

  • 条件3: 不能用在 Connect By 后, 这里的条件判断, 等价于 在最后查询出结果列表之后, 再进行条件筛选; 并非 删除掉 节点及子

你可能感兴趣的:(数据库)