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

标签 sql db2 recursive-query

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

表格

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 作为loan_id。

我们可以在没有 DB2 存储过程的情况下为此编写一个 SQL 查询吗?

最佳答案

这是使用递归 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,以便于理解。

关于sql - DB2中的递归查询以获取链中的所有项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25963799/

相关文章:

mysql - 在 mysql < 8 中获取树文件夹结构的父项和子项并且没有 CTE

mysql - 如何最大限度地减少MySQL选择查询的时间?

mysql - sql查询在一条记录中列出一组中的所有项目

sql - 如何将 DB2 SQL 结果表移动到物理文件中?

database - DB2 for z/OS 是否具有与 Oracle 中的 READ ONLY 类似的隔离级别?

sql - 使用 DashDB (DB2) 在复合 SQL 中执行 DDL

sql - 在 SQL 中复制父子结构

c# - BLL,DAL,BO,插入数据

mysql - SQL根据where row id将内容从一个表移动到另一个表

sql - SQL 嵌套注释背后的算法