场景:
我的表中有以下层次结构格式的数据:
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 8E.g
哈桑是parent_id 8 (Arshad)的孩子。
Arshad是parent_id 2的子代,这是(法鲁克)
我想要的:
首先,我想找到特定parent_id的所有父级。
例如:如果我想找到哈桑的父母,那么我也会得到哈桑的父母,也会得到他的父母(哈桑-> Arshad -> Farooq)
第二,我想找到法鲁克式的所有孩子(法鲁克->阿尔沙德->哈桑)
第三,如果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它向我展示了下面的错误:
陈述结束了。最大递归100已在语句完成之前耗尽。
发布于 2017-09-09 14:39:54
如果我正确地理解了您的问题,即您不想在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;发布于 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。
发布于 2017-09-07 07:44:46
我找到了解决上述问题的方法,那就是:
如果我的表结构如下:
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有空值,就意味着没有更多的父记录了。
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已在语句完成之前耗尽。
https://stackoverflow.com/questions/46085276
复制相似问题