DB2递归查询

斐波纳契数列,又称黄金分割数列,指的是这样一个数列:1、1、2、3、5、8、13、21、……在数学上,斐波纳契数列以如下被以递归的方法定义:F0=0,F1=1,Fn=F(n-1)+F(n-2)(n>=2,n∈N*)

上面是对递归有个小小的了解。下面给出一个具体的例子

这个例子的作用是根据ID值找出该ID对应值下的地区有哪些?

源代码:

---db2递归查询
CREATE TABLE AreaInfo
(
 ID       INTEGER NOT NULL PRIMARY KEY,
 ParentID  INT,
 NAME      VARCHAR(100)    
)

--
DROP TABLE AreaInfo

INSERT INTO AreaInfo VALUES(001,null,'云南省');

INSERT INTO AreaInfo VALUES(002,001,'曲靖市');

INSERT INTO AreaInfo VALUES(003,001,'昭通市');

INSERT INTO AreaInfo VALUES(004,001,'昆明市');

INSERT INTO AreaInfo VALUES(005,002,'陆良县');

INSERT INTO AreaInfo VALUES(006,002,'师宗县');

INSERT INTO AreaInfo VALUES(007,006,'彩云镇');

INSERT INTO AreaInfo VALUES(008,006,'雄壁镇');

INSERT INTO AreaInfo VALUES(009,005,'召夸镇');

INSERT INTO AreaInfo VALUES(010,005,'马街镇');

INSERT INTO AreaInfo VALUES(011,010,'大西村');

INSERT INTO AreaInfo VALUES(012,009,'新庄村');

INSERT INTO AreaInfo VALUES(013,004,'官渡区');

INSERT INTO AreaInfo VALUES(014,013,'官渡镇');

 

SELECT * FROM AreaInfo

查询结果如下:

查询出ID为2所对应值下的地区:

WITH RPL (ID,ParentID,NAME) AS 
(
  SELECT ID,ParentID,NAME FROM AreaInfo WHERE ID=2 
  UNION ALL 
  SELECT child.id,child.ParentID,child.name FROM RPL parent,AreaInfo child WHERE parent.id=child.ParentID
)
SELECT * FROM RPL

查询出ID为9所对应值下的地区:

WITH PPL (ID,ParentID,NAME) AS 
(
  SELECT ID,ParentID,NAME FROM AreaInfo WHERE ID=9
  UNION ALL
  SELECT child.ID,child.ParentID,child.NAME FROM PPL parent,AreaInfo child WHERE child.ParentID=parent.ID
)
SELECT * FROM PPL

 

转载于:https://www.cnblogs.com/OliverQin/p/5312207.html

DB2递归查询可以使用 Common Table Expressions (CTE) 实现,具体语法如下: ``` WITH recursive cte_name(col1, col2, ...) AS ( SELECT initial_col1, initial_col2, ... FROM initial_table WHERE initial_condition UNION ALL SELECT recursive_col1, recursive_col2, ... FROM recursive_table JOIN cte_name ON join_condition WHERE recursive_condition ) SELECT col1, col2, ... FROM cte_name; ``` 其中,`cte_name` 是指递归表达式的名称;`initial_col1, initial_col2, ...` 是指递归查询的初始列;`initial_table` 是指递归查询的初始表;`initial_condition` 是指递归查询的初始条件;`recursive_col1, recursive_col2, ...` 是指递归查询递归列;`recursive_table` 是指递归查询递归表;`join_condition` 是指递归查询中连接递归表和递归表达式的条件;`recursive_condition` 是指递归查询递归条件。 需要注意的是,在 `WITH recursive` 子句中,关键字 `recursive` 是必须的,用于标识递归查询;而在递归表达式的第一部分中,使用 `SELECT` 语句选择初始列和条件,并使用 `UNION ALL` 连接到递归部分;在递归部分中,使用 `SELECT` 语句选择递归列和条件,并使用 `JOIN` 连接到递归表达式。 举个例子,假设有一个员工表 `employee`,其中包含员工的 ID 和上级 ID,要查询每个员工的直接上级和所有上级的 ID,可使用以下递归查询语句: ``` WITH recursive cte_employee(id, manager_id, all_managers) AS ( SELECT id, manager_id, CAST(id AS VARCHAR(100)) AS all_managers FROM employee WHERE manager_id IS NULL UNION ALL SELECT e.id, e.manager_id, CONCAT(c.all_managers, ',', CAST(e.id AS VARCHAR(100))) FROM employee e JOIN cte_employee c ON e.manager_id = c.id ) SELECT id, manager_id, all_managers FROM cte_employee; ``` 在这个例子中,递归表达式的名称是 `cte_employee`,初始列是员工的 ID、上级 ID 和所有上级的 ID(初始条件是 `manager_id IS NULL`),递归列是员工的 ID、上级 ID 和所有上级的 ID(递归条件是 `e.manager_id = c.id`)。 查询结果将显示每个员工的 ID、上级 ID 和所有上级的 ID。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值