`
高级java工程师
  • 浏览: 410448 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

递归数

阅读更多
有的情况下,我们需要用递归的方法整理数据,这才程序中很容易做到,但是在数据库中,用SQL语句怎么实现?下面我以最典型的树形结构来说明下如何在Oracle使用递归查询。    
    为了说明方便,创建一张数据库表,用于存储一个简单的树形结构    
Sql代码    
1.  create table TEST_TREE         
2.  (         
3.    ID   NUMBER,         
4.    PID  NUMBER,         
5.    IND  NUMBER,         
6.    NAME VARCHAR2(32)         
7.  )       
  
ID是主键,PID是父节点ID,IND是排序字段,NAME是节点名称。初始化几条测试数据。    
引用   

ID PID IND NAME    
1 0 1 根节点    
2 1 1 一级菜单1    
3 1 2 一级菜单2    
4 1 2 一级菜单3    
5 2 1 一级1子1    
6 2 2 一级1子2    
7 4 1 一级3子1    
8 4 2 一级3子2    
9 4 3 一级3子3    
10 4 0 一级3子0    
  
一、基本使用:    
  
    在Oracle中,递归查询要用到start   with 。。。。connect   by   prior。。。    
  
    具体格式是:    
Sql代码    
1.  SELECT column        
2.  FROM table_name         
3.  START WITH column=value         
4.  CONNECT BY PRIOR 父主键=子外键       
  
对于本例来说,就是:    
Sql代码    
1.  select   d.*   from  test_tree d          
2.    start   with   d.pid=0         
3.    connect   by   prior   d.id=d.pid       
  
引用   
ID PID IND NAME    
1 0 1 根节点    
2 1 1 一级菜单1    
5 2 1 一级1子1    
6 2 2 一级1子2    
3 1 2 一级菜单2    
4 1 2 一级菜单3    
7 4 1 一级3子1    
8 4 2 一级3子2    
9 4 3 一级3子3    
10 4 0 一级3子0    
我们从结果中可以看到,记录已经是按照树形结构进行排列了,但是现在有个新问题,如果我们有这样的需求,就是不但要求结果按照树形结构显示,还要根据ind字段在每一个分支内进行排序,这个问题怎么处理呢?我们可能很自然的想到如下语句:    
Sql代码    
1.  select   d.*   from  test_tree d          
2.    start   with   d.pid=0         
3.    connect   by   prior   d.id=d.pid          
4.    order by d.ind       
  
ID PID IND NAME    
引用   
1 0 1 根节点    
2 1 1 一级菜单1    
5 2 1 一级1子1    
6 2 2 一级1子2    
4 1 2 一级菜单3    
10 4 0 一级3子0    
8 4 2 一级3子2    
9 4 3 一级3子3    
7 4 1 一级3子1    
3 1 2 一级菜单2    
 
这显然不是我们想要的结果,那下面的这个语句呢?    
Sql代码    
  select   d.*   from  (select dd.* from test_tree dd order by dd.ind) d          
    start   with   d.pid=0         
    connect   by   prior   d.id=d.pid       
  
引用   
ID PID IND NAME    
1 0 1 根节点    
2 1 1 一级菜单1    
5 2 1 一级1子1    
6 2 2 一级1子2    
4 1 2 一级菜单3    
10 4 0 一级3子0    
8 4 2 一级3子2    
9 4 3 一级3子3    
7 4 1 一级3子1    
3 1 2 一级菜单2    
 
这个结果看似对了,但由于一级菜单3节点下有一个节点的ind=0,导致一级菜单2被拍到了3下面。如果想使用类似这样的语句做到各分支内排序,则需要找到一个能够准确描述菜单级别的字段,但是对于示例表来说,不存在这么一个字段。    
 
 
那我们如何实现需求呢?其实Oracle9以后,提供了一种排序“order siblings by”就可以实现我们的需求,用法如下:    
Sql代码    
1.  select   d.*   from  test_tree d          
2.    start   with   d.pid=0         
3.    connect   by   prior   d.id=d.pid          
4.    order   siblings   by   d.ind   asc       
  
结果如下:    
 
引用   
ID PID IND NAME    
1 0 1 根节点    
2 1 1 一级菜单1    
5 2 1 一级1子1    
6 2 2 一级1子2    
3 1 2 一级菜单2    
4 1 2 一级菜单3    
10 4 0 一级3子0    
7 4 1 一级3子1    
8 4 2 一级3子2    
9 4 3 一级3子3    
这样一来,查询结果就完全符合我们的要求了。  
分享到:
评论

相关推荐

    行业分类-外包设计-可变抽样率的递归数字滤波器的介绍分析.rar

    《可变抽样率的递归数字滤波器》 在数字信号处理领域,滤波器扮演着至关重要的角色,而递归数字滤波器作为其中的一种,因其结构简单、性能优良而备受青睐。可变抽样率(Variable Sample Rate, VSR)技术的引入,...

    二叉树递归和非递归遍历以及层次构建节点数为n的二叉树

    二叉树深度 二叉树前序遍历 递归实现 二种非递归实现 二叉树中序遍历: 递归实现 非递归实现 二叉树后序遍历: ...二叉树层次创建,创建方法遵循卡特兰数 http://write.blog.csdn.net/postedit/17380455

    C++使用递归和非递归算法实现的二叉树叶子节点个数计算方法

    本文实例讲述了C++使用递归和非递归算法实现的二叉树叶子节点个数计算方法。分享给大家供大家参考,具体如下: /*求二叉树叶子节点个数 -- 采用递归和非递归方法 经调试可运行源码及分析如下: ***/ #include #...

    Python基于递归和非递归算法求两个数最大公约数、最小公倍数示例

    在本示例中,递归实现的函数gcd_test_two通过不断地让较大数除以较小数的余数来缩小问题规模,直到余数为零,此时较小数即为两数的最大公约数。 非递归算法通常指的是迭代算法,它是通过循环结构逐步逼近解的过程。...

    二叉树的操作--递归非递归遍历、结点个数、树深度

    遍历递归的先中後序, 非递归的先中後序, 计算出深度 结点数 /* 运行结果: ------------------------ 请先序输入二叉树(如:ab三个空格表示a为根节点,b为左子树的二叉树) ab c 先序递归遍历二叉树: a b c 先序...

    凑数字 凑金额 的最佳递归程序(by_kagawa)

    标题中的“凑数字 凑金额 的最佳递归程序”指的是一个使用递归算法解决特定问题的程序,其目标是在一组给定的数字中找到最佳组合,使得这些数字相加尽可能接近或者等于一个预设的目标金额。这样的问题在实际生活中...

    凑数字凑金额的最佳递归程序.xls

    凑数字凑金额的最佳递归程序

    [数理] 递归论 PDF

    《数理》递归论是一本深入探讨递归理论的学术著作,涵盖了算子、初等函数集、原始递归函数、递归函数集、递归可枚举集、判定问题以及谱系与计算复杂性等多个核心主题。下面将详细阐述这些知识点。 1. **算子**:在...

    abap简单递归算法

    ### ABAP简单递归算法解析 #### 一、引言 ABAP(Advanced Business Application Programming)是一种用于SAP系统的编程语言。它不仅支持传统的过程化编程,还支持面向对象编程和Web开发。本文将深入探讨一个ABAP中...

    N选M的所有组合(递归与非递归实现)

    组合是指在不考虑顺序的情况下,从N个不同元素中选择M个元素的方法数。在数学上,这通常用组合公式表示为C(N,M)或n choose m,其中C(N,M) = N! / [M!(N-M)!],!代表阶乘。 递归方法通常基于回溯思想,即通过不断地...

    acm递归算法总结竞赛

    - **斐波那契数列**:经典的递归例子,第n个斐波那契数是前两个数之和,递归公式为F(n) = F(n-1) + F(n-2),基础情况是F(0)=0,F(1)=1。 - **阶乘计算**:n! = n * (n-1)!,基础情况是1! = 1。 5. **效率与栈空间...

    用递归算法实现整数逆序

    ### 用递归算法实现整数逆序 #### 背景与意义 在计算机科学领域,递归算法是一种常用且强大的技术手段。通过将问题分解为更小规模的子问题来解决,递归能够有效地简化复杂度较高的计算任务。本篇文章主要探讨如何...

    FOURIER重叠数字滤波器

    文章中提到了一个具体的例子,即滤波器系数\( g(n)=[1,0.3,0.8,0.3,0] \),以及相应的非递归数字滤波器传输函数\( H(\omega)=1+0.6\cos(\omega)+0.2\cos(3\omega) \)。当应用到FOURIER重叠数字滤波器中时,通过将...

    递归算法求两个数的最大公约数

    ### 递归算法求两个数的最大公约数 #### 1. 递归方法解析 **递归算法**是一种解决问题的方法,其中函数通过调用自身来解决问题。递归算法的关键在于找到一个基本结束条件(base case),以及如何将问题分解成更小...

    读懂C++递归程序

    C++递归程序的概念及其执行过程 递归是计算机科学中的一个核心概念,它是一种解决复杂问题的方法,通过将大问题分解为规模更小、更容易解决的小问题来实现。在程序设计中,递归允许程序调用自身来处理这些分解后的...

    递归的递增进位制数法和递归的递减进位制数法

    递归的递增进位制数法和递归的递减进位制数法生成全排列。效率比传统的递增递减进位制数法

    递归实现十进制数从高位到低位依次输出

    递归实现十进制数从高位到低位依次输出 主要是我对递归算法的初步理解后试手制作希望对你有用

    N个数全排列的非递归算法

    标题 "N个数全排列的非递归算法" 涉及的是计算机科学中的经典问题——全排列。全排列是指从n个不同元素中取出m(m≤n)个元素,按照一定的顺序排成一列的所有可能组合。在这个场景中,非递归算法指的是不依赖递归...

    递归函数 递归排序法

    在编程领域,递归函数是一种基于函数自身调用自身的编程技术,它在C语言中有着广泛的应用。递归是解决复杂问题的一种有效方法,尤其在处理数据结构如树和图,以及各种算法如排序和搜索时。本篇将深入探讨递归函数的...

Global site tag (gtag.js) - Google Analytics