【发布时间】:2017-04-21 03:52:02
【问题描述】:
假设我有一张桌子,BMST。我使用此查询来查找结果集:
SELECT PARENT,
CHILD,
LEVEL,
QTY
FROM BMST
WHERE PARENT = '111'
在结果集中是父部件号,以及儿童部件号,例如:
PARENT | CHILD | LEVEL | QTY
-----------------------------
111 | 222 | 0 | 2
111 | 333 | 0 | 1
111 | 444 | 0 | 1
该表提供了有关用于制作 PARENT 零件的所有 CHILD 零件的信息,以及每个 PARENT 零件中使用的 CHILD 零件的数量。 LEVEL 列的值为“0”,因为“111”部分是我们关心的原始部分。我们不关心“111”部分是否是另一个更大的 PARENT 部分的 CHILD 部分。
如果 CHILD 部件由较小的 CHILD 部件组成,那么它们也可以是 PARENT 部件。例如,这个查询:
SELECT PARENT,
CHILD,
LEVEL,
QTY
FROM BMST
WHERE PARENT = '222'
会返回:
PARENT | CHILD | LEVEL | QTY
-----------------------------
222 | 555 | 1 | 1
222 | 666 | 1 | 1
222 | 777 | 1 | 1
这个新表中的 LEVEL 值为 '1',因为部分 '222' 是 LEVEL = '0' PARENT 部分的 CHILD 部分。
更进一步,'222' 部分的 CHILD 部分本身可能有 CHILD 部分,因此对于 '777' 部分的类似查询将返回:
PARENT | CHILD | LEVEL | QTY
-----------------------------
777 | 999 | 2 | 2
我的问题是,是否可以创建一个返回第一个结果集的查询,然后检查该结果集中的所有 CHILD 部分值以查看它们是否有任何 CHILD 部分,然后检查结果CHILD 零件用于更多的 CHILD 零件等,直到没有更多的 CHILD 零件,然后将这些零件合并到第一个结果集中,如下所示:
PARENT | CHILD | LEVEL | QTY
-----------------------------
111 | 222 | 0 | 2
222 | 555 | 1 | 1
222 | 777 | 1 | 1
777 | 999 | 2 | 2
222 | 888 | 1 | 1
111 | 333 | 0 | 1
111 | 444 | 0 | 1
随着查询的深入,LEVEL 值需要增加,最终结果集应该显示进入请求的父部分的每个部分。
有没有办法在 SQL 中完成所有这些工作?还是我必须使用 VB6 或其他程序来遍历循环?感谢您提供任何和所有反馈。
【问题讨论】:
-
使用
Recursive CTE。一定要查找该主题 -
您能否为上述输出提供准确的输入数据。
-
您可以使用 CTE 解决您的问题。谢谢
-
我一定会阅读 CTE,感谢您为我指明正确方向的朋友!
-
问这个问题的方式呈现了 XY 问题的某些方面...meta.stackexchange.com/questions/66377/what-is-the-xy-problem。您可能想阅读它并尝试将其归结为您真正需要完成的事情,而不是预设解决方案。
标签: sql sql-server sql-server-2008 tsql vb6