当前位置:  数据库>oracle

Oracle及PostgreSQL递归查询

    来源: 互联网  发布时间:2017-05-11

    本文导语: 相信大家经常会遇到这样的需求,通过一位职员的id/name获取其下属(包括非直属)所有员工列表,用java实现这个功能相信也得花上一会功夫,但是如果是依赖数据库来实现这个功能那就so easy了。先来看看Postgresql如何实现这样...

相信大家经常会遇到这样的需求,通过一位职员的id/name获取其下属(包括非直属)所有员工列表,用java实现这个功能相信也得花上一会功夫,但是如果是依赖数据库来实现这个功能那就so easy了。先来看看Postgresql如何实现这样的功能。

  • WITH RECURSIVE r AS (SELECT * FROM t_account WHEREname = #{accountName}
  • unionALL
  • SELECT t_account.* FROM t_account, r WHERE t_account.parent = r.name
  • )
  • SELECT * FROM r ORDERBYname
  • 这样是不是在代码量上减轻了很多啊,具体见postgresql官方文档http://www.postgresql.org/docs/8.4/static/queries-with.html
    接着来看看Oracle如何做递归查询:

    从ROOT往末端遍历:

    select * from t_account t start with t.parent is null connect by prior t.name=t.parent 

    从末端到ROOT端遍历:select * from t_account t start with t.name='**' connect by t.parent=t.name

    具体用法细节请参考oracle文档

    下面再参照java的实现:

  • publicclass JsonTreeGenerate {
  • private Logger logger = Logger.getLogger(JsonTreeGenerate.class);
  • private Lock lock = new ReentrantLock();
  • private Set set = new HashSet();
  • public Set getAllChild(Set sets,T node){
  • lock.lock();
  • try {
  • if(set.size()>0){
  • set.clear();
  • }
  • recursionFn(sets,node);
  • } catch (Exception e) {
  • logger.error("", e);
  • }finally{
  • lock.unlock();
  • }
  • return set;
  • }
  • publicvoid recursionFn(Set sets , T node){
  • set.add(node);
  • if(hasChild(sets,node)){
  • List hashSet = getChildList(sets , node);
  • Iterator it = hashSet.iterator();
  • while(it.hasNext()){
  • T n = (T)it.next();
  • if(null==node.getChildren()){
  • node.setChildren(new ArrayList());
  • }
  • node.getChildren().add(n);
  • recursionFn(sets,n);
  • }
  • //recursionFn(accountSet,node);
  • }
  • }
  • public List getChildList(Set list, T t){
  • List nodeList=new ArrayList();
  • Iterator it = list.iterator();
  • while(it.hasNext()){
  • T accounts = it.next();
  • if(accounts.getParent()==t.getId()){
  • nodeList.add(accounts);
  • //t.getChildren().add(accounts);
  • }
  • }
  • return nodeList;
  • }
  • publicboolean hasChild(Set list,T node){
  • List l =getChildList(list,node);
  • if(null!=l&&l.size()>0){
  • returntrue;
  • }
  • returnfalse;
  • }
  • }
  • 这个一比较就知道前者处理该问题的简洁性了吧。


        
     
     
     
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • Oracle 数据库(oracle Database)Select 多表关联查询方式
  • Oracle查询出现异常
  • Oracle将查询的结果放入一张自定义表中并再查询数据
  • oracle+jsp 多用户查询系统讨论:
  • Oracle查询表、视图、序列等信息查询
  • 关于Oracle的查询问题
  • Oracle用什么语句查询字段?
  • Oracle 查询指定表名的columns
  • linux下通过对文件读取方式查询oracle的版本信息
  • Oracle的大数据量查询结果显示问题。(高手帮忙)
  • Oracle对两个数据表交集的查询
  • Oracle数据库并行查询出错的解决方法
  • Oracle 合并查询
  • 查询与修改Oracle字符集
  • linux下通过对文件读取方式查询oracle的版本信息 iis7站长之家
  • oracle通过行范围查询取4至10行
  • mysql仿oracle的decode效果查询
  • Oracle中查询本月星期5的所有日期列表的语句
  • jsp中在oracle中查询日期类型时sql语句该怎么写啊?
  • 紧急求救:对Oracle数据库中long 型数据进行模糊查询 如何查?
  • oracle查询不含括号及不含指定字符的方法
  • Oracle 12c发布简单介绍及官方下载地址
  • 在linux下安装oracle,如何设置让oracle自动启动!也就是让oracle那个服务自动启动,不是手动的
  • oracle 11g最新版官方下载地址
  • 请问su oracle 和su - oracle有什么不同?
  • Oracle数据库(Oracle Database)体系结构及基本组成介绍
  • 虚拟机装Oracle R12与Oracle10g
  • 如何设置让Oracle SQL Developer显示的时间包含时分秒
  • Oracle 数据库开发工具 Oracle SQL Developer
  • Oracle 10g和Oracle 11g网格技术介绍
  • Oracle EBS R12 支持 Oracle Database 11g


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,