• 企业400电话
  • 微网小程序
  • AI电话机器人
  • 电商代运营
  • 全 部 栏 目

    企业400电话 网络优化推广 AI电话机器人 呼叫中心 网站建设 商标✡知产 微网小程序 电商运营 彩铃•短信 增值拓展业务
    有关数据库SQL递归查询在不同数据库中的实现方法

    本文给大家介绍有关数据库SQL递归查询在不同数据库中的实现方法,具体内容请看下文。

    比如表结构数据如下:

    Table:Tree

    ID Name ParentId

    1 一级  0

    2  二级  1

    3  三级  2

    4 四级  3

    SQL SERVER 2005查询方法:

    //上查
    with tmpTree
    as
    (
      select * from Tree where Id=2
      union all
      select p.* from tmpTree inner join Tree p on p.Id=tmpTree.ParentId
    )
    select * from tmpTree
     
    //下查
    with tmpTree
    as
    (
      select * from Tree where Id=2
      union all
      select s.* from tmpTree inner join Tree s on s.ParentId=tmpTree.Id
    )
    select * from tmpTree

    SQL SERVER 2008及以后版本,还可用如下方法:

    增加一列TID,类型设为:hierarchyid(这个是CLR类型,表示层级),且取消ParentId字段,变成如下:(表名为:Tree2)

    TId    Id    Name

    0x      1     一级
    0x58     2    二级
    0x5B40   3   三级
    0x5B5E   4   四级

    查询方法:

    SELECT *,TId.GetLevel() as [level] FROM Tree2 --获取所有层级
    DECLARE @ParentTree hierarchyid
    SELECT @ParentTree=TId FROM Tree2 WHERE Id=2
    SELECT *,TId.GetLevel()AS [level] FROM Tree2 WHERE TId.IsDescendantOf(@ParentTree)=1 --获取指定的节点所有下级
    DECLARE @ChildTree hierarchyid
    SELECT @ChildTree=TId FROM Tree2 WHERE Id=3
    SELECT *,TId.GetLevel()AS [level] FROM Tree2 WHERE @ChildTree.IsDescendantOf(TId)=1 --获取指定的节点所有上级

    ORACLE中的查询方法:

    SELECT *
    FROM Tree
    START WITH Id=2
    CONNECT BY PRIOR ID=ParentId --下查
    SELECT *
    FROM Tree
    START WITH Id=2
    CONNECT BY ID= PRIOR ParentId --上查

    MYSQL 中的查询方法:

    //定义一个依据ID查询所有父ID为这个指定的ID的字符串列表,以逗号分隔
    CREATE DEFINER=`root`@`localhost` FUNCTION `getChildLst`(rootId int,direction int) RETURNS varchar(1000) CHARSET utf8
    BEGIN
     DECLARE sTemp VARCHAR(5000);
      DECLARE sTempChd VARCHAR(1000);
      SET sTemp = '$';
      IF direction=1 THEN
       SET sTempChd =cast(rootId as CHAR);
      ELSEIF direction=2 THEN
       SELECT cast(ParentId as CHAR) into sTempChd FROM Tree WHERE Id=rootId;
      END IF;
      WHILE sTempChd is not null DO
        SET sTemp = concat(sTemp,',',sTempChd);
        SELECT group_concat(id) INTO sTempChd FROM Tree where (direction=1 and FIND_IN_SET(ParentId,sTempChd)>0)
        or (direction=2 and FIND_IN_SET(Id,sTempChd)>0);
      END WHILE;
    RETURN sTemp;
    END
    //查询方法:
    select * from tree where find_in_set(id,getChildLst(1,1));--下查
    select * from tree where find_in_set(id,getChildLst(1,2));--上查

    补充说明:上面这个方法在下查是没有问题,但在上查时会出现问题,原因在于我的逻辑写错了,存在死循环,现已修正,新的方法如下:

    CREATE DEFINER=`root`@`localhost` FUNCTION `getChildLst`(rootId int,direction int) RETURNS varchar(1000) CHARSET utf8
    BEGIN
     DECLARE sTemp VARCHAR(5000);
      DECLARE sTempChd VARCHAR(1000);
      SET sTemp = '$';
      SET sTempChd =cast(rootId as CHAR);
      
      IF direction=1 THEN
      WHILE sTempChd is not null DO
        SET sTemp = concat(sTemp,',',sTempChd);
        SELECT group_concat(id) INTO sTempChd FROM Tree where FIND_IN_SET(ParentId,sTempChd)>0;
      END WHILE;
      ELSEIF direction=2 THEN
      WHILE sTempChd is not null DO
        SET sTemp = concat(sTemp,',',sTempChd);
        SELECT group_concat(ParentId) INTO sTempChd FROM Tree where FIND_IN_SET(Id,sTempChd)>0;
      END WHILE;
      END IF;
    RETURN sTemp;
    END

    这样递归查询就很方便了。

    您可能感兴趣的文章:
    • 使用PHP数组实现无限分类,不使用数据库,不使用递归.
    • bat/cmd批处理连接SqlServer数据库查询脚本
    • php简单实现查询数据库返回json数据
    上一篇:记一次公司仓库数据库服务器死锁过程及解决办法
    下一篇:ASP和SQL Server如何构建网页防火墙
  • 相关文章
  • 

    © 2016-2020 巨人网络通讯 版权所有

    《增值电信业务经营许可证》 苏ICP备15040257号-8

    有关数据库SQL递归查询在不同数据库中的实现方法 有关,数据库,SQL,递归,查询,