首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >CTE表和CTE (MariaDB)

CTE表和CTE (MariaDB)
EN

Stack Overflow用户
提问于 2020-07-15 16:39:20
回答 1查看 37关注 0票数 0

这是我第一次在这里提出我的问题,所以我希望得到一个足够清晰的答案。

我有收藏,需要在它们之间创建一种关系。每个集合都应该是任何其他集合(及其childs)的子集。

定义的关系示例(带有ID)如下:

代码语言:javascript
复制
2
|-3
|-4

5
|-3

4
|-5

现在,当检索集合2的树时,我需要获取(期望):

代码语言:javascript
复制
2
|-3
|-4
  |-5
    |-3

然而,得到了:

代码语言:javascript
复制
2
|-3
|-4
  |-5

测试表:

代码语言:javascript
复制
CREATE TABLE collection_bom (
    id INT,
    collection_id varchar(20),
    reference_id varchar(20)
);

-- definition 2-3-4 relationship
INSERT INTO collection_bom(id,collection_id,reference_id) VALUES (1,2,NULL);
INSERT INTO collection_bom(id,collection_id,reference_id) VALUES (2,3,1);
INSERT INTO collection_bom(id,collection_id,reference_id) VALUES (3,4,2);
-- definition of 5-3 relationship
INSERT INTO collection_bom(id,collection_id,reference_id) VALUES (4,5,NULL);
INSERT INTO collection_bom(id,collection_id,reference_id) VALUES (5,3,4);
-- definition of 4-5 relationship
INSERT INTO collection_bom(id,collection_id,reference_id) VALUES (6,5,3);

查询:

代码语言:javascript
复制
with recursive cte as (
      select t.*
      from collection_bom t
      where reference_id IS NULL AND collection_id = 2
      union all
      select t.*
      from cte join
           collection_bom t
           on cte.id = t.reference_id
     )
select *
from cte;
代码语言:javascript
复制
Result:
id  collection_id   reference_id
1   2               null
2   3               1
3   4               2
6   5               3

在结果中,我还需要将collection_id 3作为5的孩子。

现在我意识到这可能不是一个好的方法。感谢任何人的帮助!

Fiddle

EN

回答 1

Stack Overflow用户

发布于 2020-07-16 21:07:42

在插入部分中有一个语义问题;5-3关系的定义从头开始创建一棵新树(具有空引用),该树独立于原始树。因此,您在第二个树中定义的"5“与第一个树中的其他"5”不同。在4-5关系的定义中,您没有使用空引用,而是将其链接到第一个表中的引用,因此它工作得很好。

此插入部分可以执行您想要的操作:

代码语言:javascript
复制
-- definition 2-3-4 relationship
INSERT INTO collection_bom(id,collection_id,reference_id) VALUES (1,2,NULL);
INSERT INTO collection_bom(id,collection_id,reference_id) VALUES (2,3,1);
INSERT INTO collection_bom(id,collection_id,reference_id) VALUES (3,4,1);
-- definition of 4-5 relationship
INSERT INTO collection_bom(id,collection_id,reference_id) VALUES (4,5,3);
-- definition of 5-3 relationship
-- INSERT INTO collection_bom(id,collection_id,reference_id) VALUES (4,5,NULL);
INSERT INTO collection_bom(id,collection_id,reference_id) VALUES (5,3,4);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62910870

复制
相关文章

相似问题

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