首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >要根据特定的子项目获取父记录还是针对父记录获取子记录的查询是什么?

要根据特定的子项目获取父记录还是针对父记录获取子记录的查询是什么?
EN

Stack Overflow用户
提问于 2017-09-06 22:35:56
回答 3查看 250关注 0票数 0

场景:

我的表中有以下层次结构格式的数据:

代码语言:javascript
复制
PERSON_ID   Name    PARENT_ID
1           Azeem   1
2           Farooq  2
3           Ahsan   3
4           Waqas   1
5           Adnan   1
6           Talha   2
7           Sami    2
8           Arshad  2
9           Hassan  8

E.g

哈桑是parent_id 8 (Arshad)的孩子。

Arshad是parent_id 2的子代,这是(法鲁克)

我想要的:

首先,我想找到特定parent_id的所有父级。

例如:如果我想找到哈桑的父母,那么我也会得到哈桑的父母,也会得到他的父母(哈桑-> Arshad -> Farooq)

第二,我想找到法鲁克式的所有孩子(法鲁克->阿尔沙德->哈桑)

第三,如果Azeem也有相同的父母,比如(Azeem,->,Azeem),那么给我看这个记录。

我尝试过的东西:

代码语言:javascript
复制
DECLARE @id INT
SET @id = 9

;WITH T AS (
    SELECT p.PERSON_ID,p.Name, p.PARENT_ID
        FROM hierarchy p
        WHERE p.PERSON_ID = @id AND p.PERSON_ID != p.PARENT_ID
    UNION ALL
    SELECT c.PERSON_ID,c.Name, c.PARENT_ID
        FROM hierarchy c
        JOIN T h ON h.PARENT_ID = c.PERSON_ID)
 SELECT h.PERSON_ID,h.Name FROM T h

它向我展示了下面的错误:

陈述结束了。最大递归100已在语句完成之前耗尽。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2017-09-09 14:39:54

如果我正确地理解了您的问题,即您不想在Parent_ID列中插入空值,那么您应该用0替换NULL,您的更新代码如下:

代码语言:javascript
复制
;WITH DATA AS (
                SELECT p.PERSON_ID,p.Name, p.PARENT_ID
                FROM hierarchy p
                WHERE p.PERSON_ID = 9
                UNION ALL
                SELECT c.PERSON_ID,c.Name, c.PARENT_ID
                FROM hierarchy c
                JOIN DATA h 
                ON c.PERSON_ID = h.PARENT_ID 
          )
select * from DATA;
票数 1
EN

Stack Overflow用户

发布于 2017-09-06 22:44:32

您的数据中有一个无限循环: Azeem是他自己的父级。您需要将他的值设为NULL或将您的条件更改为WHERE p.parent_id = @id AND p.parent_id != p.child_id

另外,我觉得您的列命名错误-主键应该命名为person_id而不是parent_id,而您的列child_id实际上指向了此人的父列,因此应该将其命名为parent_id

票数 1
EN

Stack Overflow用户

发布于 2017-09-07 07:44:46

我找到了解决上述问题的方法,那就是:

如果我的表结构如下:

代码语言:javascript
复制
PERSON_ID   Name    PARENT_ID
1           Azeem   NULL
2           Farooq  NULL
3           Ahsan   NULL
4           Waqas   1
5           Adnan   1
6           Talha   2
7           Sami    2
8           Arshad  2
9           Hassan  8

然后,我尝试了下面的查询,如果Parent_ID有空值,就意味着没有更多的父记录了。

代码语言:javascript
复制
DECLARE @id INT
SET @id = 2

Declare @Table table(
    PERSON_ID bigint,
    Name varchar(50),
    PARENT_ID bigint
    );

;WITH T AS (
SELECT p.PERSON_ID,p.Name, p.PARENT_ID
    FROM hierarchy p
    WHERE p.PERSON_ID = @id AND p.PERSON_ID != p.PARENT_ID
UNION ALL
SELECT c.PERSON_ID,c.Name, c.PARENT_ID
    FROM hierarchy c
    JOIN T h ON h.PARENT_ID = c.PERSON_ID)
insert into @table 
select * from T;

IF exists(select * from @table)
BEGIN
    select PERSON_ID,Name from @table
End
Else
Begin
    select PERSON_ID,Name from Hierarchy
    where PERSON_ID = @id
end

上面的查询显示了当我设置参数值@id =1时的愿望输出。

上面的查询显示了当我设置参数值@id =9时的愿望输出。

发行:

我不想在Parent_ID中插入空值,就像如果没有那个人的父值,那么我就在Parent_ID列中插入相同的Person_ID。如果我用那里的person_id替换空值,那么我得到了下面的错误。

陈述结束了。最大递归100已在语句完成之前耗尽。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46085276

复制
相关文章

相似问题

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