比如表结构数据如下:

Table:Tree

ID Name ParentId

1 一级  0

2  二级  1

3  三级  2

4 四级  3

SQL SERVER 2005查询方法:

  1. //上查
  2. with tmpTree
  3. as
  4. (
  5. select * from Tree where Id=2
  6. union all
  7. select p.* from tmpTree inner join Tree p on p.Id=tmpTree.ParentId
  8. )
  9. select * from tmpTree
  10.  
  11. //下查
  12. with tmpTree
  13. as
  14. (
  15. select * from Tree where Id=2
  16. union all
  17. select s.* from tmpTree inner join Tree s on s.ParentId=tmpTree.Id
  18. )
  19. select * from tmpTree

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

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

TId    Id    Name

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

查询方法:

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

可参见相关文章:http://blog.csdn.net/szstephenzhou/article/details/8277667

ORACLE中的查询方法:

  1. SELECT *
  2. FROM Tree
  3. START WITH Id=2
  4. CONNECT BY PRIOR ID=ParentId --下查
  5.  
  6. SELECT *
  7. FROM Tree
  8. START WITH Id=2
  9. CONNECT BY ID= PRIOR ParentId --上查

可参见相关文章:http://blog.csdn.net/super_marioli/article/details/6253639

MYSQL 中的查询方法:

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

补充说明:上面这个方法在下查是没有问题,但在上查时会出现问题(详见博问:http://q.cnblogs.com/q/76375/),原因在于我的逻辑写错了,存在死循环,现已修正,新的方法如下:

  1. CREATE DEFINER=`root`@`localhost` FUNCTION `getChildLst`(rootId int,direction int) RETURNS varchar(1000) CHARSET utf8
  2. BEGIN
  3. DECLARE sTemp VARCHAR(5000);
  4. DECLARE sTempChd VARCHAR(1000);
  5. SET sTemp = '$';
  6. SET sTempChd =cast(rootId as CHAR);
  7.  
  8. IF direction=1 THEN
  9. WHILE sTempChd is not null DO
  10. SET sTemp = concat(sTemp,',',sTempChd);
  11. SELECT group_concat(id) INTO sTempChd FROM Tree where FIND_IN_SET(ParentId,sTempChd)>0;
  12. END WHILE;
  13. ELSEIF direction=2 THEN
  14. WHILE sTempChd is not null DO
  15. SET sTemp = concat(sTemp,',',sTempChd);
  16. SELECT group_concat(ParentId) INTO sTempChd FROM Tree where FIND_IN_SET(Id,sTempChd)>0;
  17. END WHILE;
  18. END IF;
  19.  
  20. RETURN sTemp;
  21. END

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

可参见相关文章:http://blog.csdn.net/jackiehome/article/details/6803978

说明:以上知识点均来源于网上,我这里只是做一个合计总结。

关于SQL递归查询在不同数据库中的实现方法的更多相关文章

  1. 怎样用SQL语句查询一个数据库中的所有表?

    怎样用SQL语句查询一个数据库中的所有表?  --读取库中的所有表名 select name from sysobjects where xtype='u'--读取指定表的所有列名select nam ...

  2. SQL点滴12—SQL Server备份还原数据库中的小把戏

    原文:SQL点滴12-SQL Server备份还原数据库中的小把戏 备份数据库时出现一个不太了解的错误 ,错误信息“is formatted to support  1 media families, ...

  3. SQL语句往Oracle数据库中插入日期型数据(to_date的用法)

    Oracle 在操作数据库上相比于其他的 T-sql 有微小的差别,但是在插入时间类型的数据是必须要注意他的 to_date 方法,具体的情况如下: --SQL语句往Oracle数据库中插入日期型数据 ...

  4. SQL Server 删除当前数据库中所有数据库 ,无视约束

    Sql Server中清空所有数据表中的记录 清空所有数据表中的记录: exec sp_msforeachtable  @Command1 ='truncate table ?' 删除所有数据表: e ...

  5. sql脚本来获取数据库中的所有表结构了

    sql脚本来获取数据库中的所有表结构了,代码如下: use AdventureWorks2008 go SELECT (case when a.colorder=1 then d.name else ...

  6. excel数据通过构建sql语句导入到数据库中

    拿到一张excel数据表格,数据格式如下图所示: 2.根据excel数据结果,构建保存excel数据的表结构 CREATE TABLE #tmpExcel(IP VARCHAR(100),IPAddr ...

  7. 从excel表中生成批量SQL,将数据录入到数据库中

    excel表格中有许多数据,需要将数据导入数据库中,又不能一个一个手工录入,可以生成SQL,来批量操作.     1.首先在第二行的H列,插入函数:=CONCATENATE("INSERT ...

  8. SQL触发器批量删除数据库中的表

    以下通过触发器批量删除数据库中的表,SQL2008已验证 DECLARE @Table NVARCHAR() DECLARE @Count Int = DECLARE tmpCur CURSOR FO ...

  9. Sql Server 2008 R2数据库中插入中文变成了问号

            通过Insert语句插入数据库中,结果中文都变成了乱码.原因是在数据库中有一个属性需要设置,可以通过Sql server manager studio来进行设置,也要可以通过代码来设置 ...

随机推荐

  1. 桌面 透明 三角形 分层窗口 DX

    //桌面 透明 三角形 分层窗口 DX //IDirect3DSurface9 GetDC UpdateLayeredWindow #include <Windows.h> #includ ...

  2. mono的远程调试

    mono可以让.net程序运行在linux平台上.于是.net程序员有了mono之后就转身跨平台了.但开放环境往往还是在windows下,于是有了这样的需求,是否可以用windows下的源码来实机调试 ...

  3. Windows Phone 8.1 开发技术概览 (Universal APP)

    前一阵真的比较懒 WP8.1 已经出来这么长时间了现在才更新BLOG让大家久等了,今天我先为大家介绍下 WP 8.1的开发框架,什么是微软所推崇的 Universal APP,以及我们要开发 Univ ...

  4. 解决IE6下png图片透明度不显示的问题

    世界上最遥远的距离,不外乎我在搞前端,你却在用旧IE,现在随着XP要退休了,IE6的市场占有率应该也会逐步下滑.不过基于天朝人民的惰性以及企鹅微软的“扎篱笆”活动,做网站的朋友依旧不能忽视IE6的存在 ...

  5. EF6(CodeFirst)+MySql开发脱坑指南

    废话 话说当年,在一个春光明媚的晌午,邂逅了迷人的丁香姑娘,从此拜倒在了她的石榴裙下,至今不能自拔,这位丁香姑娘就是ORM思想. 所谓ORM思想,我的理解就是根据一定的规则,把程序中的对象和数据库中的 ...

  6. JavaScript使用DeviceOne开发实战(二) 生成调试安装包

    生成调试安装包 首先需要说明的是,这个步骤并不是每次调试App都必须的,大部分情况生成一次调试安装包,安装到手机上之后就可以忽略整个这个步骤.因为调试安装包包含了很多原生组件,都是可以定制勾选的,如果 ...

  7. [.net 面向对象编程基础] (6) 基础中的基础——运算符和表达式

    [.net 面向对象编程基础] (6) 基础中的基础——运算符和表达式 说起C#运算符和表达式,小伙伴们肯定以为很简单,其实要用好表达式,不是一件容易的事.一个好的表达式可以让你做事半功倍的效果,比如 ...

  8. [ACM_动态规划] Palindrome

    http://acm.hust.edu.cn/vjudge/contest/view.action?cid=28415#problem/D 题目大意:给一个长为n的字符串,问最少插入几个字符成回文串 ...

  9. 12小时包你学会基于ReactMix框架的ReactNativeApp开发(一)Hello World!

    ReactMixhttps://github.com/xueduany/react-mix自从昨天发布起来,得到了不少小伙伴的热捧,很高兴帮助大家解决了憋在心中很久的问题“如果我只会HTML,Css, ...

  10. Lucene系列-近实时搜索(1)

    近实时搜索(near-real-time)可以搜索IndexWriter还未commit的内容,介于immediate和eventual之间,在数据比较大.更新较频繁的情况下使用.本文主要来介绍下如何 ...