原创作品,允许转载,转载时请务必以超链接形式标明文章 、作者信息和本人声明。否则将追究法律责任。 作者: 地址:
1、使用connect by.. start with... 递归查询
递归查询就是将表中的id 与parentid 关联起来,建立关联关系之后oracle帮我们把表中所有满足条件的信息全部一次性的显示出来。
sql代码如下:
/*connect by :以...为连接基础,将id与parentid关联起来sj_id = prior sj_parentid:关联等式,prior 表示以哪个字段设为优先权限,下面例子表示以parentid为主,它会一直根据parintid去查找i栏目信息(查找所有id等于这里的parentid的栏目信息)直到结束,所以肯定会找到根节点start with :表示以什么条件开始查找,必须指定level :表示 这种关系的层级,方便理解*/select sj_id,sj_name,sj_parentid,level from tb_subject connect by sj_id = prior sj_parentid start with sj_id =22524效果图如下:
另外prior指定的位置不一样,那么它查询的效果也不一样。
sql代码如下:
/*这条语句较上面紧紧 只是prior的位置不同,但效果却完全不一样,上面说了prior表示将哪个字段设为优先权限,上面以parentid为主,永远向上查找而下面以id为主,表示id享有优先权,那么它会一直根据id去查找栏目信息(查找所有parentid等于这里的id的栏目信息)直到结束,所以肯定会找到该栏目下的所有的子节点,以及子节点下的所有子节点信息*/select sj_id,sj_name,sj_parentid,level from tb_subject connect by prior sj_id = sj_parentid start with sj_id =22524
效果图如下:
2、使用rownum 进行分页查询
oracle 的分页不像sql server 一样,可以使用 top 10 not in (select top 20 ) 这么方便,oracle 分页需要用到rownum 伪列来完成。
现在以查询第11条到20条的条件为例,目前有两种实现的方式:
sql 代码如下:
/*在子查询语句中,只有父块部分才能引用子块的别名,反之不行。使用rownum如果直接给予条件rn between 11 and 20,将什么都不会显示,因为rownun查询的结果返回的第一行永远是1,如果直接指定为11,则不满足显示情况。这条语句先查询所有的栏目信息,然后根据rownum筛选一下,最后使用between ..and ...得到我想要的第11条到20条显示*/select sj_id,sj_name,sj_parentid from( select s.*,rownum rn from ( select * from tb_subject order by sj_id ) s ) where rn between 11 and 20000; /*这条语句先查询所有的栏目信息,然后根据rownum筛选并过滤前20条信息,最后再使用之前的rownum在过滤一起取出后从第11条开始到结束的信息*/select sj_id,sj_name,sj_parentid from( select s.*,rownum rn from ( select * from tb_subject order by sj_id ) s where rownum <=20000) where rn >=11/*后来反复执行这两条语句,甚至加大查询的数目,这两条语句在执行的时候几乎相差不大。查询时间的差距微乎其微 ,从实际出发来看着两条鱼具不会太影响系统的访问性能。No.1 No.22.934 2.7932.73 3.4012.776 2.9183.136 2.823*/使用他们的效果一样,都可以达到预期的功能。
后期慢慢整理。
作者:ch656409110 发表于2013-7-23 18:44:14
阅读:67 评论:0