db2 with递归语句

WITH RPL (PID, ID, name) AS        
(        
SELECT ROOT.PID, ROOT.ID, ROOT.Name        
FROM regr ROOT        
WHERE ROOT.PID = 8   
UNION ALL       
SELECT CHILD.PID, CHILD.ID, CHILD.Name
FROM RPL PARENT, regr CHILD
WHERE PARENT.ID = CHILD.PID
)
SELECT DISTINCT PID, ID, Name        
FROM RPL
ORDER BY PID, ID, Name

让我们研究这个查询的组件:

RPL 作为一个具有以下三列的虚拟表:PID、ID 和 name。


WITH 子句内的第一个 SELECT 语句是初始化表。它只执行一次。它的结果形成虚拟表的初始内容以作为递归的种子。在上面的示例中,种子是 PID 为 8 的一行或多行。


第二个 SELECT 语句执行多次。将种子作为输入(JOIN 中的辅助表)传递给第二个 SELECT 语句以产生下一个行集合。将 JOIN 的结果添加(UNION ALL)到虚拟表的当前内容中,并放回到其中以形成用于下一次传递的输入。只要有行产生,这个过程就会继续。


如果期望,虚拟表上最后的 SELECT 允许我们选择递归查询所产生的所有行或仅部分行。

 

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。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值