视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
有关数据库SQL递归查询在不同数据库中的实现方法
2020-11-09 07:02:45 责编:小采
文档


本文给大家介绍有关数据库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数据
  • 下载本文
    显示全文
    专题