如何解决递归找到各级孩子
我有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
解决方法
由于明细表中不存在子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
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。