SQL -连接递归表

8yparm6h  于 2022-10-31  发布在  Mysql
关注(0)|答案(1)|浏览(158)

自从做SQL以来,我已经有一段时间了,所以我只想在这方面寻求帮助。
我想一个没有临时表的解决方案,如果可能的话,但总比没有好,将为每一个解决方案感到高兴!不太确定如果没有它这是可能的...
我有两张table。
表前提
| 服务地址标识|类别标识|
| - -|- -|
| 一个|五个|
| 2个|八个|
| 三个|20个|
| 四个|六个|
表类别-这只是对应于上述premises_id 3的切片。我需要为每个premises获取其类别和所有父项。
| 标识符|父标识|姓名|
| - -|- -|- -|
| 20个|十七岁|名称A|
| 十七岁|十一|名称B|
| 十一|五个|名称C|
| 五个|零值|名称D|

结果应如下所示:

| 服务地址标识|类别标识|类别名称|
| - -|- -|- -|
| 三个|20个|名称A|
| 三个|十七岁|名称B|
| 三个|十一|名称C|
| 三个|五个|名称D|
我所写的就是这个递归查询,用来获取category中的树:

with recursive categories as (
    select id, id_path, parent_id, name from category
    union all
    select c.id, c.id_path, c.parent_id, c.name from category c 
    join categories ctgs on ctgs.parent_id = c.id
) select * from categories
;

变懒了,现在会做prtscreens。它的结果很好,就像这样。有parents-path本身,如id_path,但不想依赖它。值得注意的是,并不总是孩子比父母有更高的ID!

-----------但是我不太确定如何连接它。感觉我遗漏了一些非常明显的东西,但是实际上,它的连接条件是什么?或者我应该使用临时表吗?我使用的是Mariadb 10.5。
谢谢你们的时间。

btqmn9zl

btqmn9zl1#

您希望递归查询生成具有类别ID和祖先类别ID的行(因此每个类别ID对应多个行);该路径不容易连接,而且id/父id不足以连接单个id并获得所有祖先。
比如说:

with recursive category_ancestors as (
    select id as category_id, id as ancestor_id from category
    union all
    select category_id, parent_id
    from category_ancestors
    join category on category.id=ancestor_id
    where parent_id is not null
)
select premise_id, ancestor_id
from premise
join category_ancestors using (category_id)

(显然,如果您需要,可以再次加入类别以获取名称)

相关问题