我在Postresql数据库中有两个具有多对多关系的表。
第一个主题表由三列组成。它们的名称分别为id、name和parent。主题表具有层次结构:
| 身份证|姓名|母体|
| - ------|- ------|- ------|
| 1个|数学|无|
| 第二章|代数|1个|
| 三个|进展|第二章|
| 四个|数列|三个|
| 五个|算术|1个|
| 六个|和值|五个|
第二个表具有名称任务表。它具有两列-任务ID和任务文本:
| 身份证|任务|
| - ------|- ------|
| 一百|1 + 2 + 3 + 4|
| 一百零一|一加二|
任务主题表为
| 任务标识|主题ID|
| - ------|- ------|
| 一百|三个|
| 一百|六个|
| 一百零一|1个|
我需要得到连接到主题递归查询的表。它应该由四列组成。第一列应该是任务ID,第二列是任务文本,第三列应该是主题任务的所有父名称。最后一列应该是父主题ID。
结果应为:
| 任务标识|姓名|主题名称|主题ID|
| - ------|- ------|- ------|- ------|
| 一百|1 + 2 + 3 + 4|和值|六个|
| 一百|1 + 2 + 3 + 4|算术|五个|
| 一百|1 + 2 + 3 + 4|进展|三个|
| 一百|1 + 2 + 3 + 4|代数|第二章|
| 一百|1 + 2 + 3 + 4|数学|1个|
| 一百零一|一加二|数学|1个|
我可以递归查询主题表
WITH RECURSIVE topic_parent AS (
SELECT
id,
name,
parent
FROM
topics
WHERE
id = 3
UNION
SELECT
topics.id,
topics.name,
topics.parent
FROM
topics
INNER JOIN topic_parent ON topic_parent.parent = topics.id
)
SELECT
*
FROM
topic_parent
;
但是我不知道如何通过id将它加入任务。我应该如何解决这个问题?
2条答案
按热度按时间yqlxgs2m1#
首先,cte(
WITH RECURSIVE
)用于获取主题父项,cte2
用于将主题数组转换为行,然后我们将数据连接在一起以获得预期结果。Demo here
7tofc5zh2#
应产生如下结果:
通过SQL沿着以下操作: