db2和oracle中的树查询(递归查询)语句-

在db2和oracle中的对树的递归查询语句。

表结构:

create table  MAIN_NODE (

MLA_ID               INTEGER     not null        ,   //节点ID

MLA_ROOTID          INTEGER,                      //根节点ID

MLA_PARENTID        INTEGER,                      //父节点ID

MLA_NAME            VARCHAR2(50),                //节点名称

constraint P_mlaid primary key (MLA_ID) );

MLA_ID   MLA_PARENTID  MLA_ROOTID   MLA_NAME

1           0                   0             父节点1     

2           1                   0            (父节点1的/)子节点1   

3            2                   0            (父节点1的/子节点1的/)孙子节点1

4           0                   0             父节点2     

5           4                   0            (父节点2的/)子节点1   

树结构直观图:

根节点(0)
     父节点1(1)
           (父节点1的/)子节点1(2) 
                     (父节点1的/子节点1的/)孙子节点1(3)
     父节点2(4)
           (父节点2的/)子节点1(5)

语句要求的功能:实现给出一个父节点id然后得到该父节点下的所有子节点的信息Db2 的查询语句:


WITH  RPL (mla_parentid, mla_id, mla_name) AS

(

SELECT ROOT.mla_parentid, ROOT.mla_id, ROOT.mla_name FROM main_node ROOT WHERE ROOT.mla_id = ?

UNION  ALL

SELECT CHILD.mla_parentid, CHILD.mla_id, CHILD.mla_name FROM RPL PARENT, main_node CHILD WHERE PARENT.mla_parentid = CHILD.mla_id

 )

SELECT DISTINCT mla_parentid, mla_id, mla_name FROM RPL ORDER BY mla_parentid, mla_id, mla_name

让我们研究这个查询语句:
RPL 作为一个具有以下三列的虚拟表:mla_parentid, mla_id 和 mla_name。
WITH 子句内的第一个 SELECT 语句是初始化表。它只执行一次。它的结果形成虚拟表的初始内容以作为递归的种子。在上面的示例中,种子是 mla_id 为 任意传进去的参数 的一行或多行。
第 二个 SELECT 语句执行多次。将种子作为输入(JOIN 中的辅助表)传递给第二个 SELECT 语句以产生下一个行集合。将 JOIN 的结果添加(UNION ALL)到虚拟表的当前内容中,并放回到其中以形成用于下一次传递的输入。只要有行产生,这个过程就会继续。
如果期望,虚拟表上最后的 SELECT 允许我们选择递归查询所产生的所有行或仅部分行。

Oracle的查询语句:



   select mla_parentid, mla_id, mla_name from main_node



start with mla_id=? connect by prior mla_id=mla_parentid


让我们研究这个查询语句:
  本语句实际上是 start with ...connect by 的用法, start with 后面所跟的就是就是递归的种子。在上面的示例中,种子是 mla_id 为 任意传进去的参数
connect by 后面的"prior"如果缺省:则只能查询到符合条件的起始行,并不进行递归查询;
connect by prior 后面所放的字段是有关系的,它指明了查询的方向。如果后面放的是 mla_id=mla_parentid 则表明从本节点查向叶子节点;如果后面放的是 mla_parentid = mla_id则表明从根节点查向本节点;
文章转自庄周梦蝶  ,原文发布时间5.17

时间: 2024-09-10 07:30:08

db2和oracle中的树查询(递归查询)语句-的相关文章

oracle中sql汇总查询相关的问题

问题描述 oracle中sql汇总查询相关的问题 怎么通过一条sql查询出如下表中的所有记录数和交易成功记录数,其中status是交易状态(交易状态 [0:未付款;1:交易关闭;2:已付款;3:交易完成(含退款);4:交易成功;5:交易失败(担保交易)]6.支付中), 表结构如下: 解决方案 http://www.oschina.net/question/2257111_177653 解决方案二: select count(1) as zongshu,'总数' as leixing from a

oracle中复杂sql查询语句详解 (1/4)

1.查询语句的使用 使用 select语句和子查询(subquery)可以从一个或多个表,视图,实体试图中返回数据.   1.1相关子查询 可以将子查询(as subquery)或in或exists当成where的一个条件的一部分,这样的查询称为子查询   .where中可以包含一个select语句的子查询   .where中可以包含in,exists语句   .最多可以嵌套16层   .层次过多会影响性能   [例]简单子查询实例   查询是否有的专家既以研究所的名义来申请基金项目,又以大学系

Oracle 数据库的分页查询sql语句

oracle 数据库教程的分页查询sql语句   oracle       select * from (select rownum r,t1.* from 表名称 t1 where rownum < m + n) t2 where t2.r >= m 例如从表sys_option(主键为sys_id)中从10条记录还是检索20条记录,语句如下: select * from (select rownum r,t1.* from sys_option where rownum < 30 )

oracle中得到一条SQL语句的执行时间的两种方式_oracle

oracle中如果需要得到一条SQL语句的执行时间可以用如下2种方式 复制代码 代码如下: SQL> set timing on; SQL> select count(*) from wea; COUNT(*) ---------- 39490 已用时间: 00: 00: 00.06 SQL> select sql_text, elapsed_time from v$sql 2 where sql_text like 'select count(*) from wea'; 未选定行 已用

oracle中的树型查询

oracle         在项目开发中树型结构是经常被使用的,通常情况下我们对查询的结果集使用一些免费的js文件就能达到很好的显示效果,比如         但是有时候我们需要对下拉列表也提供树型结构(比如论坛的板块跳转),这个时候我们就可以使用oracle9i以上版本提供的CONNECT BY 子句了.  SELECT kindid,kindname,fatherid      FROM kn_kind      CONNECT BY PRIOR kindid=fatherid     

oracle中如何把查询内容输出到文本

把查询内容输出到文本 set echo off pagesize 0 heading off feedback off termout off spool test.sql select count(*) from user_tables; spool off 上面的脚本执行完之后就会将查询内容输出至test.sql 第一行中的set命令对环境进行了设置 具体要设置哪些可以根据需求自己增减,下面附上set参数说明 set time on               //显示时间 set cols

菜鸟提问:oracle中按月份查询

问题描述 怎样在oracle数据库中查出在一个月内的所有记录,或者就是怎样按月份查询(前提数据库中有一个date类型的属性)!                                             求解,谢谢! 问题补充:<p><img src="/images/smiles/icon_surprised.gif" alt=""> 怎样在oracle数据库中查出在一个月内的所有记录,或者就是怎样按月份查询(前提数据库中有一个

在oracle中编写树级代码

oracle create table Dept( DepartNO  varchar2(10),   DepartName  varchar2(20), TopNo    varchar2(10)); insert into Dept values('001','董事会','0');insert into Dept values('002','总裁办','001');insert into Dept values('003','财务部','001');insert into Dept valu

oracle中的合并查询

为了合并多个select语句的查询结果,可以使用集合操作符UNION,UNION ALL,INTERSECT和MINUS.语法如下:   SELECT语句1  [ UNION | UNION ALL | INTERSECT | MINUS ]  SELECT语句2   使用集合操作符有以下一些限制: .对于LOB,VARRAY,嵌套表类来说,集合操作符无效 .对于LONG型,UNION ALL,INTERSECT和MINUS无效 .如果选择列表包含了表达式,必须指定别名 1.UNION,用于获取