从两个父列之一获取所有子孙

时间:2018-04-03 06:31:19

标签: sql sql-server

我需要找到所有父子关系,这些关系都链接到我的主要列ID

enter image description here

enter image description here

到目前为止,我已尝试过以下内容,但只能使用一列。

    WITH tb  (id,Name, Level, Path, Parent)
AS
(
 SELECT 
    id,Name, 1 AS Level, 
    CAST('/'+Name as nvarchar(max)) as Path,
    CAST(NULL as nvarchar(max)) as Parent
 FROM krishtest
 WHERE parent1 IS NULL

 UNION All

 SELECT 
    e.id,e.Name, x.Level + 1 AS Level, x.Path + '/' + e.Name as Path,
    REVERSE(SUBSTRING( REVERSE(x.[Path]) ,0 , CHARINDEX( '/', REVERSE(x.[Path])) )) as [Parent]
 FROM krishtest e
 JOIN tb x ON x.id = e.parent1


)
SELECT Name, Level, Path, Parent FROM tb

1 个答案:

答案 0 :(得分:1)

据我所知,父母可以在parent1或parent 2列中;那么在这种情况下你的查询应该如下

唯一的变化是使用关键字 COALSECE ,它会从列表中获取第一个非NULL值。

错误假设是parent1和parent2都不是(Non-Null)。

See live demo

;
WITH tb  (id,Name, Level, Path, Parent)
AS
(
 SELECT 
    id,Name, 1 AS Level, 
    CAST('/'+Name as nvarchar(max)) as Path,
    CAST(NULL as nvarchar(max)) as Parent
 FROM krishtest
 WHERE COALESCE(parent1,parent2) IS NULL

 UNION All

 SELECT 
    e.id,e.Name, x.Level + 1 AS Level, x.Path + '/' + e.Name as Path,
    REVERSE(SUBSTRING( REVERSE(x.[Path]) ,0 , CHARINDEX( '/', REVERSE(x.[Path])) )) as [Parent]
 FROM krishtest e
 JOIN tb x ON x.id = COALESCE(e.parent1,e.parent2)


)
SELECT Name, Level, Path, Parent FROM tb