您当前的位置:首页 > 美文欣赏 > 内容

sql 怎么递归查询的方法:?sql语句中怎么实现递归查询

本文目录

  • sql 怎么递归查询的方法:
  • sql语句中怎么实现递归查询
  • 如何实现SQL语句的递归查询
  • sql语句实现递归查询所有节点,mysql和oracle都能用的
  • DNS递归查询的步骤
  • 路由器的递归查询怎样解释
  • 递归和迭代有什么区别

sql 怎么递归查询的方法:

1.创建测试表,createtabletest_connect(idnumber,p_idnumber);

2.插入测试数据,

Insertintotest_connectvalues(1,1);

Insertintotest_connectvalues(2,1);

Insertintotest_connectvalues(3,2);

Insertintotest_connectvalues(4,3);

提交;

3.查询数据表的内容,选择*fromtest_connect,

4.执行递归查询语句,将答案添加到nocycle元素中,就不会有[ora-01436:CONNECTBYerrorintheuserdata]。执行结果如下:

Select*

来自test_connectt

从id=4开始

由nocyclepriort连接。p_id=t.i.

sql语句中怎么实现递归查询

在SQLSERVER2000中你可以先一些自定义函数,或一些存储过程,实现递归:selectlevel,TypeNamefromProductTypetSTARTWITHt.ParentID=0CONNECTBYPRIORt.ProductTypeID=t.ParentID;

如何实现SQL语句的递归查询

1.创建测试表,createtabletest_connect(idnumber,p_idnumber);

2.插入测试数据,

Insertintotest_connectvalues(1,1);

Insertintotest_connectvalues(2,1);

Insertintotest_connectvalues(3,2);

Insertintotest_connectvalues(4,3);

提交;

3.查询数据表的内容,选择*fromtest_connect,

4.执行递归查询语句,将答案添加到nocycle元素中,就不会有[ora-01436:CONNECTBYerrorintheuserdata]。执行结果如下:

Select*

来自test_connectt

从id=4开始

由nocyclepriort连接。p_id=t.i.

sql语句实现递归查询所有节点,mysql和oracle都能用的

首先说一下Oracle的递归查询,相信大部分人都知道很简单。无非start with connect by 函数。下面是从pId向子节点递归查询的例子,unId是数据库表中的主键。

如果是从子节点递归到父节点查询,就把start with 换成unid,prior左右对换

下面再讲MySql 的递归查询方式。MySql没有Oracle的强大功能,虽然都是同一个公司的产品。所以只能靠自己写。有很多方法,用sql去循环查询,或者写存储过程,我这里只提供一种。就是新建一个function函数。

表结构不说了,无非就是 Id ,pId,其他列。下面是创建一个递归查询子节点的函数

DROP FUNCTION IF EXISTS queryChildrenPowerInfo;

CREATE FUNCTION `queryChildrenPowerInfo` (powerId VARCHAR(2000))

RETURNS VARCHAR(2000)

BEGIN

DECLARE sTemp VARCHAR(2000);

DECLARE sTempChd VARCHAR(2000);

SET sTemp = ’$’;

SET sTempChd = cast(powerId as CHAR);

WHILE sTempChd is not NULL DO

SET sTemp = CONCAT(sTemp, ’,’, sTempChd);

SELECT group_concat(id) INTO sTempChd FROM t_discretionary_power where FIND_IN_SET(pId,sTempChd)》0;

END WHILE;

return sTemp;

END

调用的时候:select  queryChildrenPowerInfo(“fa2528924c7e9168014c9bedfe04039c“); 该语句会返回Id和父Id等于传入参数powerId的一个字符串,中间有逗号隔开如图

下面这句代码的意思是,查询出 t_discretionary_power  表中,t.id 等于上面查询出的结果集的数据。FIND_IN_SET(A,B)是MYSQL的函数。意思是查找在B集合中有A的数据。相当于In

select t.* from t_discretionary_power  t where FIND_IN_SET(t.id,queryChildrenPowerInfo(’fa2528924c7e9168014c9bedfe04039c’))

DNS递归查询的步骤

一个完整的域名格式应该是“www.abc.com.”最后的那个“.”就叫根域,也叫点域,通常在域名中都是省略的。递归查询就是主机向DNS服务器发送域名查询请求,服务器直接把查询的结果返回给主机。与递归查询相对应的是迭代查询。迭代查询的步骤是:1、主机将查询请求发送到本地DNS服务器。2、本地DNS服务器查询不到结果。即将该请求转发到互联网上的根域。3、根域将所要查询域名中的顶级域(假设要查询www.abc.com,该域名的顶级域就是com)的服务器IP地址返回到本地DNS。4、本地DNS根据返回的IP地址,再向顶级域(就是com域)发送请求。5、com域服务器再将域名中的二级域(即www.abc.com中的abc。如果是www.abc.com.cn,它的顶级域就是cn,com在这里就变成了二级域)的IP地址返回给本地DNS。6、本地DNS再向二级域发送请求进行查询。7、之后不断重复这样的过程,直到本地DNS服务器得到最终的查询结果,并返回到主机。这时候主机才能通过域名访问该网站。

路由器的递归查询怎样解释

什么是路由? 所谓路由的过程就是从入站接口接收到数据包,经过CPU的处理(查找路由表,重构二层帧),把“新”包放入到相应的接口的过程。这个过程实际上可以 转化成下面的一个模型:一辆汽车(数据包)走到了一个十字路口,注意,此时它是有目的地的(目的IP地址),比如这辆汽车想去往北京,到了这个十字路口, 看到了有几个牌子上面写着“北京,石家庄,唐山”,那么这个时候驾驶员(CPU)就应该来选择那个去往北京的路口(出站接口),这样也就完成了路由功能。更进一步,微观上的路由查询是怎么进行的。这里所说的微观,并不去讨论路由转发的各种算法,而是去讨论路由器如何去查找路由表。我们先来看一个简单的拓扑有四个路由器,分别是POOH,TIGGER,PIDET,RABBIT,在这个拓扑下面显示的是POOH的路由表,可以看到,现在已经可以从POOH上查询到了五个网段,也就是说现在达到了全网互通。举 例来说,如果想达到网段10.1.10.0,CPU开始查找路由表,发现了一个路由条目是到达10.1.10.0的,通过192.168.1.194,而 这个地址就是piglet路由器最左边的那个端口,那么这个192.168.1.194又是怎么到达呢?再一次查找路由表,找到了一个网段 192.168.1.192,这里面就包含了192.168.1.194这个地址,而到达它是通过192.168.1.66来实现的。那么 192.168.1.66又是应该怎么到达?还得继续查找路由表。192.168.1.194这个过程在周而复始的进行,形成一个递归的过程,知道路由器找到直连网段位置,按照上面的那个实例来说就是当找到192.168.1.64这个条目。好了,这就是路由器递归查询的过程。但是,这样的查询方法有什么用途呢?你是否考虑过呢?先让我们回到一个比较本质的问题上去,路由器和交换机的作用是什么?其实无非是两个作用,一是考虑如何把数据包正确的送到目的地址,二是如何更快的送到。 至于其他的各种安全技术,QoS等等都是为这两个终极目标服务的。由于本篇不涉及到交换机的内容所以在此略过不提,单说路由器,工程师们为了让路由器更好的完成这两个任务做出了不懈的努力,其中一个就是不断改进的包交换方法以达到快速的转发包的目的。先让我们从历史的角度看一下最早诞生的是“进程交换”这种交换很传统,路由器每收到一个包就会通过CPU查找路由表然后送到出站端口,每过来一个包就会这样做一次。这种方法是没有问题的,但是却很慢,明显的效率不高。为了解决这个问题,“快速交换”诞生了这 里面有一个前提,也是能开发出“快速交换”的一个先提条件,那就是我们的数据一般都是以流的形式传播的,流,这个词十分形象,就是一串数据包都去往同一个 地方。当工程师发现了这个规律之后,“快速交换”的想法诞生了,所谓快速交换就是,先分析每个流的第一个包,按照进程交换的方式进行查询,然后出站同时把 这个查询的结果保存在一个独立的缓存中。当这个流中剩下的包进站时,路由器不是去查路由表而是去查缓存,这样就能节省CPU的资源,直接把包转发出去。这 样不但提高了包转发的速度,实际上也提高了CPU的使用效率。最后就是CEF思科的快速交换,CEF有太多的内容需要讲,相对于前两种交换方式有很大的不同,我在这里只取其在交换形式上的差别。进程交换是当一个新数据流来了后路由第一个包,然后把信息记入缓存来对转发进行加速。而CEF的做法更绝!连第一个包都不用查了,直接进行缓存操作!而且是在包之前就进行了缓存。也就是大名鼎鼎的FIB表。当一个数据包入站的时候,直接查询FIB表而不是路由表,这样就能大大增加转发的速度。也 许你有疑问,我当初就是有疑问的,本来有好好的路由表,现在又建立了一个FIB表,一个数据包到了不还是需要查找吗?这样有什么作用?很显然现在一般的图 书上并没有写明原因,没有给我一个合理的解释。不过对于这个问题,以及对于CEF的专题讨论我会在下周的时候单独写一篇文章来叙述,让你明白CEF!现在让我们尊重一个事实,CEF更快!我用了大量的篇幅来写看似与本篇主题无关的“路由器交换”,我想告诉大家的是“加快交换,远离路由表”,CPU路由查询的次数越少转发的效率越高!那么现在让我们回到本篇文章的主题“递归路由的查询”,强烈的困惑!人家查一次路由表都嫌多,你却使用递归查询查了那么多遍路由表!确实,这就是递归查询的最大缺点!也是我们在设计网络的时候必须要考虑的一个问题。不过仔细想一下,既然这是一个极为“不成功”的方法,那么为什么还会允许它的存在呢?这又是为了什么?递归查询的优势!无与伦比的优势!我们来看一下这个拓扑,注意一下SANDERZ的静态路由的设计。这就是一个典型的递归路由的使用案例,可以仔细的看一下。这里我们先设计一个情景,从显示的路由路由信息来看,现在到达右侧网段的所有数据都要从HEFFALUMP路由器通过,这个时候如果HEFFALUMP坏了,那么必须要从WOOZLE进行路由。这个时候网络管理员只需要调整一条路由就可以了。Sanderz(config)# ip route 10.87.14.0 255.255.255.0 10.23.5.95 Sanderz(config)# no ip route 10.87.14.0 255.255.255.0 10.23.5.20这样就完成了任务。那么如果不使用递归路由呢?那么图中的每一个路由都要重新设置,如果按照上图的案例来说,我们需要重新写26条路由条目。如果你觉得这样的数量还能忍受, 那么如果有100个,400个网段呢?你要重写200条,800条路由!这个工作量就大了吧,你还能忍受吗?同样是400个网段,使用递归路由还是上面的 两条命令。借用并改造算法中时间复杂度的概念:不使用递归路由的时间复杂度为O(n),而使用了递归路由的时间复杂度为O(1)!这也就是递归路由最大的优点!面对递归路由的优点与缺点,确实是很难办,是需要斟酌的。(这是《ROUTING TCP/IP VOL.1 》的说法)不过我想其实并不是那么“难办”从实际的网络应用来讲,现在能够使用静态路由的网络拓扑不会很大,相对于路由器CPU的处理能力来讲不是很大的负担,也就不会很影响速度,所以为了管理的方便我们是可以放心的使用递归路由的。但是,我这种说法并不包含 两个大的园区网之间用静态路由的情况(教育网),这样的情况还是使用最普通的路有方式吧。具体情况具体分析,相必大家对与递归路由的优势和缺点也是很熟悉了,能够在其间取舍。

递归和迭代有什么区别

一、含义不同:

递归是重复调用函数自身实现循环。迭代是函数内某段代码实现循环,循环代码中参与运算的变量同时是保存结果的变量,当前保存的结果作为下一次循环计算的初始值。

递归循环中,遇到满足终止条件的情况时逐层返回来结束。迭代则使用计数器结束循环。当然很多情况都是多种循环混合采用,这要根据具体需求。

二、结构不同:

递归与迭代都是基于控制结构:迭代用重复结构,而递归用选择结构。 递归与迭代都涉及重复:迭代显式使用重复结构,而递归通过重复函数调用实现重复。

 递归与迭代都涉及终止测试:迭代在循环条件失败时终止,递归在遇到基本情况时终止,使用计数器控制重复的迭代和递归都逐渐到达终止点:迭代一直修改计数器,直到计数器值使循环条件失败;递归不断产生最初问题的简化副本,直到达到基本情况。

递归算法一般用于解决三类问题:

(1)数据的定义是按递归定义的。(Fibonacci函数)

(2)问题解法按递归算法实现。

这类问题虽则本身没有明显的递归结构,但用递归求解比迭代求解更简单,如Hanoi问题。

(3)数据的结构形式是按递归定义的。

如二叉树、广义表等,由于结构本身固有的递归特性,则它们的操作可递归地描述。

以上内容参考:百度百科-递归


声明:本文版权归原作者所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,谢谢。

上一篇: 麦是什么结构的字(麦是什么结构)

下一篇: 哪种摄像头是拍压实线(哪个摄像头是拍压实线)



推荐阅读

网站内容来自网络,如有侵权请联系我们,立即删除! | 软文发布 | 粤ICP备2021106084号