sql-server - 递归查找所有级别的孩子
问题描述
我有 2 张桌子。在这里提琴
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 |
+---------+----------+-------+
我必须从表中获取带有“VALID”的 id,并从表中Details
找到其所有级别的子级。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
推荐阅读
- r - 有没有办法在查看搜索路径的其余部分之前始终检查一个特定包中的函数?
- python - 在数组中查找第二大项未按预期工作
- c++ - 如何找到 FFmpeg 错误代码的含义?
- java - 从 JFileChooser Java 中检索文件中的行数
- powershell - Powershell5 通过组合 foreach、begin、process 和 replace 命令压缩代码
- javascript - 即使我引用了正确的元素 ID,也无法读取 null 的属性“addEventListener”
- javascript - 拆分和添加数组
- javascript - 为什么当我运行与 onclick 属性绑定的函数时我的类属性未定义?
- python - 两个刻度标签在图中以 symlog 比例重叠
- java - JSON:数组和比较