DB2通过SQL实现递归查询
2010-08-09 15:21
225 查看
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
的查询语句:
[b]WITH RPL (mla_parentid, mla_id, mla_name) AS
[/b]
[b]( [/b]
[b]SELECT ROOT.mla_parentid, ROOT.mla_id, ROOT.mla_name FROM main_node ROOT WHERE ROOT.mla_id = ?
[/b]
[b]UNION ALL [/b]
[b]SELECT CHILD.mla_parentid, CHILD.mla_id, CHILD.mla_name FROM RPL PARENT, main_node CHILD WHERE PARENT.mla_parentid = CHILD.mla_id[/b]
[b] ) [/b]
[b]SELECT DISTINCT mla_parentid, mla_id, mla_name FROM RPL ORDER BY mla_parentid, mla_id, mla_name[/b]
[b]让我们研究这个查询语句:
[/b]
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则表明从根节点查向本节点;
相关文章推荐
- DB2通过SQL实现递归查询 (根据子机构查询机构所属树)
- 通过Sql实现根据分组合并指定列内容的查询
- 通过SQL case when语法实现统计SQL的纵表转横向
- 通过Velocity模板实现了Hibernate sql-query的动态(SQL/HQL)
- ABP框架用Dapper实现通过SQL访问数据库
- 在oracle中通过connect by prior来实现递归查询!
- MySQL通过视图(或临时表)实现动态SQL(游标)
- DB2 SQL 递归实现多行合并
- 通过java反射实现对javabean生成各种sql语句
- Spark-Streaming与Spark-Sql整合实现实时股票排行---通过kafka列队数据
- Spark-Streaming与Spark-Sql整合实现实时股票排行---通过kafka列队数据
- spqrk通过rdd和dataset实现相同sql操作
- 通过SQL绘制杨辉三角的实现方法介绍
- 在SQL Server中通过SQL语句实现分页查询
- PL/SQL通过修改配置文件的方式实现数据库的连接听语音
- 在SQL Server中通过SQL语句实现分页查询
- 模拟实现MyBites中通过SQL反射实体类对象功能
- 在oracle中通过connect by prior来实现递归查询!
- PageOffice+C#+SqlServer+Aspose.Word+Aspose.Cells实现上传word模板,通过标签保存填写的数据到数据库中
- pl/sql通过修改配置文件的方式实现数据库的连接