sqlite 多表递归查找

wfsdck30  于 2023-05-29  发布在  SQLite
关注(0)|答案(1)|浏览(157)

我有多个表,我需要从中提取父/子信息的每一个表中的一个项目。例如:

Table1:
| id | Name     | ParentIDFromTable2 | Weight | Height |
| 1  | Jack     | 5                  | 180    | 183    |
| 2  | Sparrow  | 3                  | 210    | 169    |
| 3  | John     | 6                  | 350    | 210    |
| 4  | Jill     | 2                  | 110    | 140    |
| 5  | Juliet   | 7                  | 122    | 150    |

Table2:
| id | Name     | GrandParentID     | Location |
| 1  | Adam     | 0                 | Earth    |
| 2  | Zack     | 1                 | Earth    |
| 3  | Noah     | 2                 | Earth    |
| 4  | Jacob    | 3                 | Earth    |
| 5  | Jeff     | 4                 | Earth    |
| 6  | Drake    | 5                 | Earth    |
| 7  | Kanye    | 3                 | Earth    |

因此,对于表1中的每一行,我希望能够提取完整的父子关系层次结构沿着该行的属性,例如对于表1条目:
ID=1 >>>姓名=杰克,体重=180,身高=183,血统=地球/亚当/扎克/诺亚/雅各布/杰夫/杰克
ID=5 >>>姓名=朱丽叶,体重=122,身高=150,血统=地球/亚当/扎克/诺亚/坎耶/朱丽叶
我尝试使用递归查找,但不知道如何从Table 2中对ParentID进行递归

knsnq2tg

knsnq2tg1#

使用递归CTE和GROUP_CONCAT()窗口函数连接位置:

WITH 
  target AS (SELECT * FROM Table1 WHERE id = 1),
  cte AS (
    SELECT *, 1 level FROM Table2 WHERE id = (SELECT ParentIDFromTable2 FROM target)
    UNION ALL
    SELECT t2.*, c.level + 1 
    FROM Table2 t2 INNER JOIN cte c
    ON c.GrandParentID = t2.id
  )
SELECT *,
      (SELECT Location || '/' || 
              GROUP_CONCAT(Name, '/') OVER (ORDER BY level DESC) FROM cte ORDER BY level LIMIT 1
      ) || '/' || Name Lineage
FROM target;

参见demo

相关问题