复杂的SQL查询,在单个查询中列出树
我有一个Oracle SQL 10g表,其中包含与物料清单相关的数据。例如,一个项目有一个原材料清单,该清单可能包含一个有自己材料清单的项目,并且在该清单中可能有一个有自己材料清单的项目 我需要列出材料清单及其相关项目,如果有子项目,则列出该项目清单,如果这些项目有任何清单,则列出该清单,等等。。。。。 我们不知道项目的树级别,它是随机的 我现在无法发布图片,我将解释如下: A项——原材料1 A项——原材料2 项目A——半成品项目1——原材料3 项目A——半成品项目1——原材料4 项目A---半成品项目1-半成品项目2-原材料5 项目A---半成品项目1-半成品项目2-半成品项目3-原材料6 等等,等等 新例子: 项目代码BOMCODE数量 ABCD XYZ 1 ABCD2 XYZ 8 ABCD3 XYZ 3 ABCD4 XYZ 56 ABCD76 ABCD3 1 ABCD98 ABCD3 5 ABCD34 ABCD4 2 ABCD21 ABCD4 8 ABCD90 ABCD98 9 ABCD31 ABCD98 2 表中有3个字段:itemcode、bomcode和qty 此示例适用于“xyz”项目,要生产“xyz”项目,我们需要项目代码中列出的项目以及提及的数量,如果您查看一些项目,如“abcd3”、“abcd4”,它们有自己的物料清单,与“abcd98”相同。我不知道级别,因为它是随机的,可以有任意数量的级别。此结果:复杂的SQL查询,在单个查询中列出树,sql,oracle,Sql,Oracle,我有一个Oracle SQL 10g表,其中包含与物料清单相关的数据。例如,一个项目有一个原材料清单,该清单可能包含一个有自己材料清单的项目,并且在该清单中可能有一个有自己材料清单的项目 我需要列出材料清单及其相关项目,如果有子项目,则列出该项目清单,如果这些项目有任何清单,则列出该清单,等等。。。。。 我们不知道项目的树级别,它是随机的 我现在无法发布图片,我将解释如下: A项——原材料1 A项——原材料2 项目A——半成品项目1——原材料3 项目A——半成品项目1——原材料4 项目A---半
| LEVEL | BOMCODE | ITEMCODE | QTY |
|-------|---------|----------|-----|
| 1 | XYZ | ABCD | 1 |
| 1 | XYZ | ABCD2 | 8 |
| 1 | XYZ | ABCD3 | 3 |
| 1 | XYZ | ABCD4 | 56 |
| 2 | ABCD3 | ABCD76 | 1 |
| 2 | ABCD3 | ABCD98 | 5 |
| 2 | ABCD4 | ABCD21 | 8 |
| 2 | ABCD4 | ABCD34 | 2 |
| 3 | ABCD98 | ABCD31 | 2 |
| 3 | ABCD98 | ABCD90 | 9 |
通过此查询生成:
SELECT
LEVEL, BOMCODE, ITEMCODE, QTY
FROM
BOMS
WHERE
LEVEL <= 30
START WITH BOMCODE = 'XYZ'
CONNECT BY PRIOR ITEMCODE = BOMCODE
ORDER BY
LEVEL, BOMCODE, ITEMCODE, QTY
;
作者:
正如@Used\u已经解释过的,下面的查询是对我问题的回答:
SELECT
LEVEL, BOMCODE, ITEMCODE, QTY
FROM
BOMS
WHERE
LEVEL <= 30
START WITH BOMCODE = 'XYZ'
CONNECT BY PRIOR ITEMCODE = BOMCODE
ORDER BY
LEVEL, BOMCODE, ITEMCODE, QTY
;
你的要求不清楚。你能告诉我们你试过什么问题吗?此外,如果你不能发布图片,请将其上传到图片托管服务上,如果可能,提供链接。为此任务开发一个链接。IMO无法回答此问题。如果你不知道树级别,我们将如何处理?我们如何提出一个没有表名和字段名的查询?我们还需要一些样本数据来尝试任何建议的查询。我不能直接回答你的问题,但你真的应该使用谷歌。搜索函数SYS\u CONNECT\u BY\u PATH的示例用法。@CodeNewbie-在上述问题中添加了一个示例。THankshave在上述问题中添加了一个示例。非常感谢你,我通过你的第一个查询得到了我想要的结果。再次感谢。没问题,你会接受答案吗?顺便说一句,这表明问题是完整的,并且是问答过程中的一个重要部分。你应该评论他的帖子,最重要的是接受他的回答!这不应该被勾选为答案,哦,好吧,我理解你所做的。干杯
SELECT
LPAD(' ', 2*level-1)||'XYZ'||SYS_CONNECT_BY_PATH(ITEMCODE, '/') "Path"
FROM
BOMS
WHERE
LEVEL <= 30
START WITH BOMCODE = 'XYZ'
CONNECT BY PRIOR ITEMCODE = BOMCODE
ORDER BY
LEVEL, BOMCODE, ITEMCODE, QTY
;
SELECT
LEVEL, BOMCODE, ITEMCODE, QTY
FROM
BOMS
WHERE
LEVEL <= 30
START WITH BOMCODE = 'XYZ'
CONNECT BY PRIOR ITEMCODE = BOMCODE
ORDER BY
LEVEL, BOMCODE, ITEMCODE, QTY
;