上一篇中讲解了ORACLE中的递归查询,下面我们看一下DB2中如何使用递归查询:

同样的我们先新建一个表来存储以上信息,并插入测试数据:

--建表
create table FAMILY
(
person_id INTEGER,
name VARCHAR(10),
parent_id INTEGER
);
--插入测试数据
insert into FAMILY (PERSON_ID, NAME, PARENT_ID) values (1, 'Apple', 2); insert into FAMILY (PERSON_ID, NAME, PARENT_ID) values (2, 'Zoe', 4); insert into FAMILY (PERSON_ID, NAME, PARENT_ID) values (3, 'Tom', 4); insert into FAMILY (PERSON_ID, NAME, PARENT_ID) values (4, 'John', 7); insert into FAMILY (PERSON_ID, NAME, PARENT_ID) values (5, 'Peter', 6); insert into FAMILY (PERSON_ID, NAME, PARENT_ID) values (6, 'Robert', 10); insert into FAMILY (PERSON_ID, NAME, PARENT_ID) values (7, 'Mary', null); insert into FAMILY (PERSON_ID, NAME, PARENT_ID) values (8, 'Jenny', 7); insert into FAMILY (PERSON_ID, NAME, PARENT_ID) values (9, 'Sam', 10); insert into FAMILY (PERSON_ID, NAME, PARENT_ID) values (10, 'Li Lei', null);

在DB2中使用with字句实现递归查询:

WITH temp (person_id, name, parent_id, LEVEL)
AS (SELECT person_id,
name,
parent_id,
0
FROM FAMILY
WHERE person_id = '' --找寻person_id=1的人的祖先
UNION ALL
SELECT SUPER.person_id,
SUPER.name,
SUPER.parent_id,
CHILD.LEVEL + 1
FROM FAMILY SUPER, temp CHILD
WHERE SUPER.person_id = CHILD.parent_id)
SELECT * FROM temp

得到,如图我们可以得到Apple的父亲是Zoe,Zoe父亲是John,看level依次类推,Mary是他们老祖宗,

当然,我们除了可以得到某个节点的父节点,

WITH temp (person_id, name, parent_id, LEVEL)
AS (SELECT person_id,
name,
parent_id,
1
FROM FAMILY
WHERE person_id = '' --找寻person_id=4的人的祖先
UNION ALL
SELECT SUPER.person_id,
SUPER.name,
SUPER.parent_id,
CHILD.LEVEL + 1
FROM FAMILY SUPER, temp CHILD
WHERE SUPER.person_id = CHILD.parent_id)
SELECT * FROM temp

也可以得到某个节点的子节点:

WITH temp (person_id, name, parent_id, LEVEL)
AS (SELECT person_id,
name,
parent_id,
1
FROM FAMILY
WHERE person_id = '' --找寻person_id=4的人的传人
UNION ALL
SELECT CHILD.person_id,
CHILD.name,
CHILD.parent_id,
SUPER.LEVEL + 1
FROM FAMILY CHILD, temp SUPER
WHERE SUPER.person_id = CHILD.parent_id)
SELECT * FROM temp

得到,其中Tom跟Zoe都是John的子节点。

DB2 递归查询的更多相关文章

  1. DB2递归查询

    斐波纳契数列,又称黄金分割数列,指的是这样一个数列:1.1.2.3.5.8.13.21.……在数学上,斐波纳契数列以如下被以递归的方法定义:F0=0,F1=1,Fn=F(n-1)+F(n-2)(n&g ...

  2. db2 with用法

    最近在研究db2 递归查询时想到了with,一直以为with只是用来查询递归,但是实际with功能强大,还有更加强大的功能,偶然读到一位大神的文章,对with做了很详细的解读,特贴出来供大家学习研究 ...

  3. 你搞懂 ORACLE、 SQLSERVER、MYSQL与DB2的区别了吗

    ORACLE. SQLSERVER.MYSQL与DB2的区别--平台性:    Oracle.MYSQL与DB2可在所有主流平台上运行:    SQL Server只能在Windows下运行: --安 ...

  4. Oracle 递归查询

    现实中我们经常需要用到一些递归查询,下面我们来介绍下ORACLE中递归查询的使用. 首先我们先新建一个表来存储以上信息 create table FAMILY ( person_id INTEGER, ...

  5. DB2 公共表表达式(WITH语句的使用)

    ----start 说起WITH 语句,除了那些第一次听说WITH语句的人,大部分人都觉得它是用来做递归查询的.其实那只是它的一个用途而已,它的本名正如我们标题写的那样,叫做:公共表表达式(Commo ...

  6. db2构建临时结果集

    一 values  ('1',2,3)   为一行   ‘1’   2    3   行数据类型可以不同  values  ('1',2,3),('f',5,6) 为两行 (values  1,2,3 ...

  7. DB2重启数据库实例

    DB2重启数据库实例时,有时停止实例会失败,此时需要先确认没有应用链接数据库,然后再关闭数据库实例,并重新启动. 1.查看是否有活动的链接 命令:db2 list applications for d ...

  8. MSSQLServer中组织或分类表的设计及其递归查询

    开篇:项目中用到上下级从属关系的太多太多了,如:组织.分类.行政区域,这里不再一一介绍,遇到这种的如何去进行数据库表的设计及其应用的,个人对往期项目中所涉及到的进行了一些总结. 数据库表设计:表字段一 ...

  9. C# 连接DB2字符串 Oracle免安装客户端连接字符串

    以下是DB2连接数据库 1)使用IBM.Data.DB2链接DB2数据库 2)必须安装DB2客户端,IBM.Data.DB2在安装的BIN里可以找到 3)注意一下DB2客户端版本问题,我的就是WIN7 ...

随机推荐

  1. chrome调试、移动端调试

    chrome 32版本后,添加 DevTools for Mobile 插件就可远程手机调试 DevTools for Mobile插件安装https://support.google.com/chr ...

  2. 基于XMPP的即时通信系统的建立(四)— 协议详解

    Presence 在XMPP协议中,我们使用presence来获取用户是否已经上线以及是否可以通信的状态. 为了能够知道自己联系人的状态以及让联系人知道自己的状态,用户上线后需要订阅联系人的状态,联系 ...

  3. Windows下免费、开源邮件服务器hMailServer

    Windows下免费.开源邮件服务器hMailServer 一.Windows下搭建免费.开源的邮件服务器hMailServer 二.邮件服务器hMailServer管理工具hMailServer A ...

  4. Struts框架搭建时所遇到的问题

    问题一:Unable to load configuration. - bean - jar:file:/D:/Tomcat%206.0/webapps/bar/WEB-INF 原       因:可 ...

  5. 证明:寝室分配问题是NPC问题

    P.NP.NPC.NP-hard P:多项式时间能够解决的问题的集合,比如最短路径问题是集合P的一个元素,而最短路径问题本身又是一个集合,因此P是集合的集合. NP:多项式时间内能够验证的问题的集合. ...

  6. DbgPrint输出格式 Unicodestring

    DbgPrint输出格式 Unicodestring  1) 直接打印字符串. DbgPrint("Hello World!"); 2) 空结尾的字符串,你可以用普通得C语法表示字 ...

  7. LeetCode Maximum Product Subarray 最大子序列积

    题意:给一个size大于0的序列,求最大的连续子序列之积.(有正数,负数,0) 思路:正确分析这三种数.0把不同的可能为答案的子序列给隔开了,所以其实可以以0为分隔线将他们拆成多个序列来进行求积,这样 ...

  8. Java [Leetcode 268]Missing Number

    题目描述: Given an array containing n distinct numbers taken from 0, 1, 2, ..., n, find the one that is ...

  9. 开发ffmpeg/live555常见问题错误及解决方法

    #include <iostream>using namespace std;extern "C" {#include <libavcodec/avcodec.h ...

  10. 用实例分析H264 RTP payload

    用实例分析H264 RTP payload H264的RTP中有三种不同的基本负载(Single NAL,Non-interleaved,Interleaved) 应用程序可以使用第一个字节来识别. ...