2017-09-06 47 views
0

场景:查询获取针对特定孩子的父母记录或针对父母获取孩子记录的查询是什么?

我在我的桌子下面的层级格式的数据:

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 

哈桑是PARENT_ID 8是儿童(艾尔沙德)

和Arshad是parent_id 2的子代,它是(Farooq)

我想要什么:

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

例如:如果我想找到哈桑的父母,然后我也得到哈桑的父母也得到其父(哈桑 - >艾尔沙德 - >法鲁克)

其次,我想找到的所有子(Farooq - > Arshad - > Hassan)

第三,如果Azeem也有同样的父母像(Azeem - > Azeem),然后显示我这个记录。

我已经试过尚未:

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 

及其显示我以下错误:

The statement terminated. The maximum recursion 100 has been exhausted before statement completion.

+0

我删除了[tag:mysql]标签,因为我怀疑你使用的是MySQL。它看起来像你正在使用Microsoft SQL Server,所以我添加了该标签。 –

+0

@BillKarwin我很感激。 –

+1

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

回答

1

如果我正确理解你的问题,你不想插入PARENT_ID列空值,那么你应该用0取代NULL和更新的代码会像:

;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

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

另外,我觉得你有你的列名为周围走错了路 - 主键应该被命名为person_id而不是parent_id和您的命名child_id列实际上指向的是人的,所以它应该被命名为parent_id代替。

+0

根据你的格式我已经编辑我的帖子也添加一个条件,如果Azeem它自己的父母然后也显示我这个记录。如果我在Parent_ID列中放置空值它会返回数据,但是当在参数'@ id'中时,我传递2的值,并且它的Parent_ID为空,那么它不会给出任何记录。但是,如果Person_ID和Parent_ID相同,那么它会显示我的记录。 –

+0

为什么我的投稿投票是我在我的问题中缺少的东西? –

+0

请看我的答案。 –

0

好吧,我找到了我的上述情况下的方式是:

如果我有如下表结构:

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有NULL值的手段该记录不再有父母。

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

enter image description here

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

enter image description here

问题:

我不想在Parent_ID中插入空值,就好像没有更多Parent的Parent那么我在Parent_ID列中插入相同的Person_ID。 如果我用那里的person_id替换空值,那么我得到了错误。

The statement terminated. The maximum recursion 100 has been exhausted before statement completion.

+0

指定在查询结束时MAXRECURSION选项: ... 从EmployeeTree 选项(MAXRECURSION 0) 这允许您指定的CTE如何往往会产生错误之前递归。 Maxrecursion 0允许无限递归。 – Brainsbot

+0

https://stackoverflow.com/questions/9650045/the-maximum-recursion-100-has-been-exhausted-before-statement-completion – Brainsbot

+0

@Brainsbot我看到这篇文章,并在我的代码中应用接受的答案,但这没有在我的情况下工作。除非我按停止执行按钮来中断递归循环,否则循环不会停止它继续运行。 –