首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >递归CTE -获取后代(多到多关系)

递归CTE -获取后代(多到多关系)
EN

Stack Overflow用户
提问于 2017-12-12 19:30:30
回答 1查看 786关注 0票数 1

我所拥有的:

给定一棵树(或更像有向图),该树描述系统是如何由其泛型部分组成的。现在,让这个系统成为人体和节点,它的身体部分。

例如,3可以是有左叶和右叶的肝脏(69),两者都有静脉(8) (也可以在肝脏的任何未指明的部位找到,因此8->3),但也可以在舌头(5)中找到。肺(7) -在胸部(4) -也有一个右叶,等等。(当然,肝脏中没有肺,6->7也是合理的,所以这个例子不是最好的,但你明白了。)

所以我把这些数据放在这样的数据库里:

代码语言:javascript
复制
table: part
+----+------------+   id is primary key
| id | name       |
+----+------------+
|  1 | head       |
|  2 | mouth      |
|  3 | liver      |
|  4 | chest      |
|  5 | tongue     |
|  6 | left lobe  |
|  7 | lung       |
|  8 | veins      |
|  9 | right lobe |
+----+------------+

table: partpart
+-------+---------+   part&cont is primary key
| part  | cont    |   part is foreign key for part.id
+-------+---------+   cont is foreign key for part.id
|   2   |    1    |
|   3   |    1    |
|   5   |    2    |
|   6   |    3    |
|   7   |    3    |
|   7   |    4    |
|   8   |    3    |
|   8   |    5    |
|   8   |    6    |
|   8   |    9    |
|   9   |    3    |
|   9   |    7    |
+-------+---------+

我想达到的目标是:

我想查询在part 3中可以找到的所有部分,并期望得到这样的结果:

代码语言:javascript
复制
result of query
+-------+---------+
| part  | subpart |
+-------+---------+
|   3   |    6    |
|   3   |    7    |
|   3   |    8    |
|   3   |    9    |
|   6   |    8    |
|   7   |    9    |
|   9   |    8    |
+-------+---------+

我觉得以这种期望的格式取得结果是不可行的,不过,如果能把它作为一个类似的集合,那就太好了,因为我的目的是为用户显示这样的数据:

代码语言:javascript
复制
3
├─ 6
│  └─ 8
├─ 7
│  └─ 9
│     └─ 8
├─ 8
└─ 9
   └─ 8

我是如何努力:

代码语言:javascript
复制
WITH RECURSIVE tree AS (

  SELECT part.id as part, partpart.cont (..where to define subpart?)
  FROM part JOIN partpart
  ON part.id = partpart.part
  WHERE part.id = 3

  UNION ALL

  SELECT part.id, partpart.cont
  FROM (part JOIN partpart
  ON part.id = partpart.part
  ), tree
  WHERE partpart.cont = tree.part

)

SELECT part, subpart FROM tree

这是我能做的最接近的事,但当然不起作用。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-12-13 20:47:49

问题解决了,这是我需要的查询,我希望它曾经帮助过其他人.

代码语言:javascript
复制
WITH RECURSIVE graph AS (
  SELECT
    p.id AS subpart,
    pp.cont AS part
  FROM part p JOIN partpart pp
  ON p.id = pp.part
  WHERE pp.cont = 3
  UNION ALL
  SELECT
    part.id,
    partpart.cont
  FROM (part JOIN partpart
  ON part.id = partpart.part
  ), graph WHERE partpart.cont = graph.subpart
)
SELECT part, subpart, FROM graph
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47780183

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档