在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则表明从根节点查向本节点;
分享到:
相关推荐
本文将深入探讨这两个数据库系统中如何使用递归查询语句来操作树形结构。 首先,让我们理解什么是树形结构。在数据存储中,树形结构是一种层次化的数据模型,它由节点(或称为记录)组成,每个节点可以有零个或多...
但是,DB2数据库中没有类似的语句,需要使用公共表表达式(CTE)和UNION ALL来实现递归。 DB2递归实现有很多应用场景,例如组织结构图(org chart)、目录树、社交网络等。这些应用场景都需要使用递归查询来实现。...
**注意:** Oracle提供了`CONNECT BY`语法来实现层次查询,而DB2则通过递归公共表表达式(CTE)来实现。 #### 九、打印输出信息 **Oracle:** ```sql DBMS_OUTPUT.PUT_LINE('Hello World'); ``` **DB2:** ```sql ...
Oracle 和 DB2 是两种流行的关系数据库管理系统,它们之间存在许多差异,这些差异在实际应用中对开发人员和 DBA 产生了很大的影响。本文将详细介绍 Oracle 和 DB2 之间的差异,包括并发机制、数据类型、隐式类型转换...
Oracle 11GR2的递归WITH子查询是一种强大的工具,它允许你在SQL查询中创建递归关系,处理层级数据,比如组织结构、家族树或依赖关系等。WITH子查询,也称为公共表表达式(Common Table Expression,简称CTE),自SQL...
- **Connect by**:在Oracle中用于递归查询的`CONNECT BY`语句,在DB2中需要使用复杂的`WITH`子句结合`UNION ALL`来实现类似功能。 - **Left/Right Join**:DB2不支持Oracle中的`+`符号来表示左连接或右连接,而需...
例如,在Oracle中,可以利用CONNECT BY子句实现树结构的递归查询,而在IBM DB2中,递归查询的SQL语句由初始查询、递归查询和最终查询三部分组成。但是,MS SQL Server在当时尚未内置递归查询功能,这意味着在MS SQL ...
### 第二章 SQL数据操作和查询 #### 1. SQL简介 结构化查询语言(Structured Query Language, SQL)是一种用于访问和处理数据库的标准语言。SQL由多个子集组成,包括数据定义语言(DDL)、数据操纵语言(DML)、数据查询...
- **日期时间转换**: 分别介绍了在DB2、MySQL、Oracle、PostgreSQL和SQL Server中的日期时间转换方法。 - **删除数据**: 如DELETE语句的使用。 - **提取函数(EXTRACT)**: 用于从日期或时间戳中提取特定部分。 - **...
在SQL数据库中,树形数据...通过学习和实践这些方法,我们可以有效地处理和查询SQL中的树形数据,无论是简单的分类树还是复杂的多层级结构。 Jet Wang的示例将提供具体的代码实例,帮助我们更好地理解和应用这些概念。
- 分析SQL中的复杂功能,如TALLY表和递归查询等。 #### 六、作者观点 - **Roger Carlson**(Microsoft Access MVP):赞扬本书不仅告诉读者如何做,还解释了为什么这么做;将设计考虑融入SQL使用的各个方面。 - *...
详细介绍了使用 BULK COLLECT 进行批量操作 提高sql的执行效率 使用MERGE INTO USING 一条sql搞定 新增和修改 使用connect by 进行递归树查询
11.9.3 My SQL Server和DB2中递归查询 附录A 常用数据库系统的安装和使用 A.1 DB2的安装和使用 A.2 MySQL的安装和使用 A.3 Oracle的安装和使用 A.4 Microsoft SQL Server的安装和使用