DB2 中的递归查询以获取链中的所有项目

Posted

技术标签:

【中文标题】DB2 中的递归查询以获取链中的所有项目【英文标题】:Recursive query in DB2 to get all items in the chain 【发布时间】:2014-09-21 20:58:06 【问题描述】:

我必须通过仅提供一个作为输入来检索所有通过贷款链接的客户。示例我有一个表数据为

表格

LOAN_ID    CLIENT_ID
1          7
1          8
2          7
4          8
4          9
4         10
5          9
5         11
13        2
14        3

如果我只给出了 CLIENT_ID=7 的输入,那么查询必须从上面的表中选择除最后两列之外的所有列,因为 client_id 7 具有 1,2 LOAN_ID,而在 1 中,CLIENT_ID 8 具有 Loan_id=4,并且在此贷款 CLIENT_id 9 再次有 5 作为贷款 ID。

我们可以为此编写一个不使用 DB2 存储过程的 sql 查询吗?

【问题讨论】:

我已经改写了您的问题,因为您的示例中没有子父概念。 【参考方案1】:

以下是使用递归 CTE 查询对您的问题的回答:

WITH links AS
( SELECT 
    loan_id, 
    client_id as c1, 
    client_id as c2, 0 as distance 
  FROM 
    myTable 
  -- recursion 
  UNION ALL
  SELECT 
     t.loan_id, 
     l.c1 as c1, 
     tt.client_id as c2, 
     distance = distance + 1 
  FROM 
    links l INNER JOIN
    myTable t ON l.c2 = t.client_id
    AND l.loan_id != t.loan_id INNER JOIN
    myTable tt  ON t.loan_id = tt.loan_id 
     AND t.client_id != tt.client_id
 )
SELECT * FROM myTable t
WHERE EXISTS 
    (SELECT * FROM links 
     WHERE c2 = t.client_id and c1 = 7);

http://sqlfiddle.com/#!3/8394d/16

我在查询中留下了distance,以便于理解。

【讨论】:

感谢 Bulat 的询问。我以前从未使用过 CTE/递归。我正在尝试在 DB2 中使用 START BY 和 CONNECT。无论如何感谢您的询问,我现在对使用 RCTE 有了更好的理解。 我测试了查询,但它会无限循环。 我添加了距离 从 DB2 for i5/OS Version 5 Release 4 开始支持 CYCLE 和 SEARCH DEPTH FIRST/BREADTH FIRST。它们不受 DB2 (9.7) 和 DB2 (10) for z/OS 的支持 准确地说,知道如何在 z/OS 环境中替换它们吗?

以上是关于DB2 中的递归查询以获取链中的所有项目的主要内容,如果未能解决你的问题,请参考以下文章

SQL 查询以获取每个经理下的员工的递归计数

mysql中的递归调用

mysql递归查询语句

如何在递归 SQL 查询中查找子树中的所有节点?

DB for z/OS 中的递归查询

sql server 递归查询