首页 > 解决方案 > 使用 SQL 获取孩子的所有父母

问题描述

我有一个表,其中包含名为社区的属性(CommunityID、Name、Description、ParentCommunityID)。CommunityID是主键,ParentCommunityID是外键指的是同一张表。没有父级的社区的ParentCommunityID价值为 NULL。我想选择一个社区的所有父母。

我尝试使用在此处找到的答案。但是当我进入一个没有父社区的社区时(在我的情况下 parentCommunityID 为空)它给出了错误的答案。此外,如果我从中删除DISTINCT关键字,有时会select DISTINCT ParentCommunityID给出相同的CommunityID两次。

with communities as 
(
   select CommunityID, ParentCommunityID
   from communities
   where CommunityID = 268 
   union all
   select c.CommunityID, c.ParentCommunityID
   from communities c
   join communities p on c.CommunityID = P.ParentCommunityID 
   AND c.CommunityID<>c.ParentCommunityID 
) 
select ParentCommunityID
from communities
ORDER BY ParentCommunityID;

我无法弄清楚这段代码有什么问题?我想选择一个社区的所有家长。我对此查询也没有明确的想法。

标签: sqldatabaserecursionhierarchy

解决方案


您正在使用“社区”作为 with 的别名。它应该有所不同,因此您可以对您的联接有一个清晰的定义:

with _communities as 
(
   select CommunityID, ParentCommunityID
   from communities
   where CommunityID = 11
   union all
   select p.CommunityID, p.ParentCommunityID
   from communities p
   join _communities c on p.CommunityID = c.ParentCommunityID 
) 
select ParentCommunityID
from _communities
where ParentCommunityId is not null
ORDER BY ParentCommunityID;

这是DBFiddle 演示。


推荐阅读