递归找到各级孩子

问题描述

我有2张桌子。 Fiddle Here

Details

+-----+-----------+
| id  | valid     |
+-----+-----------+
| 101 | VALID     |
| 102 | NOT VALID |
| 103 | VALID     |
| 104 | NOT VALID |
+-----+-----------+

Relation

+---------+----------+-------+  
| parent  | child    | stock |
+---------+----------+-------+
| 101     | 101A     | 3     |
| 101     | 101B     | 1     |
| 101     | 101C     | 4     |
| 101A    | 101A-V1  | 3     |
| 101A-V1 | 101A-V2  | 6     |
| 102     | 102A     | 2     |
| 102     | 102B     | 3     |
| 103     | 103A     | 5     |
| 103     | 103BB    | 4     |
| 103     | 103M     | 5     |
| 103BB   | 103BB-V1 | 4     |
+---------+----------+-------+

我必须从Details中获取带有“ VALID”的ID,并从relation表中找到其所有子级。所以预期的输出是

+----------+-------+
| ID       | Valid |
+----------+-------+
| 101      | VALID |
| 101A     | VALID |
| 101B     | VALID |
| 101C     | VALID |
| 101A-V1  | VALID |
| 101A-V2  | VALID |
| 103      | VALID |
| 103A     | VALID |
| 103BB    | VALID |
| 103M     | VALID |
| 103BB-V1 | VALID |
+----------+-------+

我尝试了以下cte,但它没有给它的孩子。我只有顶级父母。

;with Cte2 As
        (
        SELECT a.*
        FROM details a
        WHERE a.valid = 'VALID'
        
        UNION ALL
        
        SELECT a.*
        FROM details a
        join relation s 
        on a.id = s.child
        JOIN cte2 c ON s.parent = c.id
        )
        select * FROM Cte2 

Fiddle Here

解决方法

由于明细表中不存在子ID,因此联接不会提取任何内容。

我认为您应该这样做。

;with cte2 as
        (
        select 
            a.id,a.valid
        from details a
        where a.valid = 'VALID'
        union all
        select 
            s.child,c.valid
        from relation s 
        join cte2 c on s.parent = c.id
        )

select * from cte2 
order by cte2.id
,

我并不是说这是最好的方法,但这对我有用。

;with cte as
(
select * from details
where valid = 'valid'
union
select R.child,FIRST_VALUE(D.valid) OVER (ORDER BY D.valid ASC) AS Valid
from details D
cross apply relation R
Where valid = 'valid' and D.id = left(R.parent,3))
select * from cte

enter image description here

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...