复杂的SQL查询,在单个查询中列出树

复杂的SQL查询,在单个查询中列出树,sql,oracle,Sql,Oracle,我有一个Oracle SQL 10g表,其中包含与物料清单相关的数据。例如,一个项目有一个原材料清单,该清单可能包含一个有自己材料清单的项目,并且在该清单中可能有一个有自己材料清单的项目 我需要列出材料清单及其相关项目,如果有子项目,则列出该项目清单,如果这些项目有任何清单,则列出该清单,等等。。。。。 我们不知道项目的树级别,它是随机的 我现在无法发布图片,我将解释如下: A项——原材料1 A项——原材料2 项目A——半成品项目1——原材料3 项目A——半成品项目1——原材料4 项目A---半

我有一个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”相同。我不知道级别,因为它是随机的,可以有任意数量的级别。

此结果:

| 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
;