本文给大家介绍有关数据库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

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

mysql 在不同的数据库间查询语句_有关数据库SQL递归查询在不同数据库中的实现方法...相关推荐

  1. oracle function 写查询语句_五个 SQL 查询性能测试题,只有 40% 及格率,你敢来挑战吗?...

    作者 | 董旭阳TonyDong,CSDN 博客专家 责编 | 唐小引 头图 | CSDN 下载自东方 IC 出品 | CSDN 博客 下面是 5 个关于索引和 SQL 查询性能的测试题:其中 4 个 ...

  2. excel mysql 参数查询语句_如何用SQL语句查询Excel数据?

    如何用SQL语句查询Excel数据? Q:如何用SQL语句查询Excel数据? A:下列语句可在SQL SERVER中查询Excel工作表中的数据. 2007和2010版本: SELECT*FROMO ...

  3. excel mysql 参数查询语句_如何用SQL语句查询Excel数据

    Q:如何用SQL语句查询Excel数据? A:下列语句可在SQL SERVER中查询Excel工作表中的数据. 2007和2010版本: SELECT * FROM OpenDataSource( ' ...

  4. Mysql数据库check约束语句_怎么用sql命令语句写check约束

    展开全部 用sql命令语句写CHECK约束32313133353236313431303231363533e59b9ee7ad9431333433623137的格式为CHECK (约束条件). 如: ...

  5. mysql 数据库里查询语句中不等于的两种写法

    mysql 数据库里查询语句中不等于的两种写法 ps:本人亲测,阿里云2核4G5M的服务器性价比很高,新用户一块多一天,老用户三块多一天,最高可以买三年,感兴趣的可以戳一下:阿里云折扣服务器 1.my ...

  6. MySQL精讲(一) |DQL数据查询语句全解析

    MySQL精讲系列文章(更新完毕) <MySQL入门必看知识> <MySQL精讲(一) | DQL数据查询语句全解析> <MySQL精讲(二) | DML数据操作语句全解 ...

  7. mysql pool返回值_【Mysql】你知道一条查询语句是如何执行的吗?

    [Mysql]你知道一条查询语句是如何执行的吗?​mp.weixin.qq.com 前言 在默认大家学习了Mysql结构的基础上,我们来深入的解析一下sql语句在mysql中是如何流转和实现的.本文会 ...

  8. Oracle数据库数据查询语句示例(包含大部分常用语句)

    Oracle数据库数据查询语句示例(包含大部分常用语句) 目标 本文用到的关系模式 语句示例 1.在创建的s,p,j和spj表中完成以下查询 (1)查询零件重量在10-20之间(包括10和20)的零件 ...

  9. mysql空值判断怎么优化_MySQL查询语句优化的十个小技巧!

    前言 查询语句的优化是SQL效率优化的一个方式,可以通过优化sql语句来尽量使用已有的索引,避免全表扫描,从而提高查询效率.最近在对项目中的一些sql进行优化,总结整理了一些方法. 1.尽量避免在 w ...

最新文章

  1. java版电子商务spring cloud分布式微服务b2b2c社交电商 (十四)服务注册(consul)
  2. 解决网络故障的一般方法
  3. C#中的平台调用(P/Invoke)
  4. 关于微信小程序下拉出现三个小点
  5. 四款新旗舰即将发布:小米10和iPhone9领跑,价格惊喜
  6. 计算机个人培训终结,计算机一级培训个人工作总结
  7. 使用fseek()函数随机访问文件
  8. 调试记录:基于NCN5120芯片的KNX-485桥接模块
  9. POI导出Excel时 设置单元格类型为 数值类型 或者文本类型
  10. notempty注解属于哪个依赖_@NotEmpty、@NotNull、@NotBlank注解解析
  11. 计算机外联管理办法,外联部管理制度
  12. 基于FPGA的正弦信号发生器设计
  13. 开发届这些公司的自白
  14. framemaker 换行
  15. 程序设计思维与实践 Month3 模拟
  16. 立创商城pcb封装导入
  17. 接口自动化思路_JAVA
  18. 超详细讲解代理服务器的使用方法(多图)
  19. Task01c:随机抽样与卡方检验的SQL实现
  20. 这15年专业之外的吐血学习总结。

热门文章

  1. jupyter 更换主题
  2. 想让中考作文收获“稳稳的幸福”?《作文的顿悟》有高招
  3. 5个Python迷你项目,玩一整天不是问题(附源码)
  4. js监听div高度变化
  5. 《机器学习》随心记-周志华版 评估方法
  6. 英语流利说 第16天
  7. 【关于IDEA工具中Junit测试无法读取键盘录入的解决办法】
  8. C++常用标准模板库——queue
  9. 你连985都考不上,哪来的资格谈素质教育?
  10. Excel隐藏指定区域空单元格整行内容的操作!