2014-08-27 64 views
0

我有一个Oracle SQL(10g)表,其中包含与物料清单相关的数据。例如,一件物品有一份原材料清单,该清单可能包含带有自己物料清单的物料,并且该清单中可能有一个物料可能有自己的物料清单。复杂SQL查询,在单个查询中列出树

我需要列出物料清单及其相关物品,如果有任何子物品,那么物品清单以及这些物品是否有任何清单,然后列出清单等等...... We不知道树的物品等级,它是随机的。

我现在无法张贴图片,我将解释如下:

项目A ------原料1个
项目A ------原料2
项目A ------半成品1 - 原料3
项目A ------半成品1 - 原料4
项目A ------半成品1 - 半成品项目2 - 原材料5
项目A ------半成品1 - 半成品2 - 半成品3 - 原材料6
等,等....

新实施例:

ITEMCODE BOMCODE QTY
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'。我不知道这个级别是随机的,它可以有任意数量的级别。

+0

你的要求是不清楚。你可以告诉我们你试过什么查询吗?此外,如果您无法发布图片,请将其上载到图片托管服务,并在可能的情况下提供链接。 – CodeNewbie 2014-08-27 07:45:58

+0

为此任务开发[分层查询](http://docs.oracle.com/cd/B19306_01/server.102/b14200/queries003.htm)。 – PrR3 2014-08-27 07:46:01

+0

这不能回答IMO。如果你不知道树的水平,我们会怎样?以及我们如何提出一个没有表名和字段名的查询?我们还需要一些样本数据来试用任何提议的查询。 – 2014-08-27 07:47:38

回答

0

正如@Used_By_Already解释,下面的查询是回答我的问题:

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

你应该只是评论他的帖子,而最重要的是接受他的答案呢! – Emmanuel 2014-08-27 10:59:40

+0

不知道,谢谢你的建议。 – user3625561 2014-12-04 10:39:01

+0

这不应该被打勾作为答案,哦,我明白你做了什么。干杯。 – 2015-02-12 02:19:44

0

这个结果:

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

我用的BOMS表名,并在where子句是任意使用的级别数,它的存在为真正实现递归数量的“安全”。

看到This SQLfiddle demo

不知道这是否是你想要的。也许以下几点:

PATH 
------------------------------ 
XYZ/ABCD 
XYZ/ABCD2 
XYZ/ABCD3 
XYZ/ABCD4 
XYZ/ABCD3/ABCD76 
XYZ/ABCD3/ABCD98 
XYZ/ABCD4/ABCD21 
XYZ/ABCD4/ABCD34 
XYZ/ABCD3/ABCD98/ABCD31 
XYZ/ABCD3/ABCD98/ABCD90 

由:

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

在上面的问题中增加了一个示例。 THanks – user3625561 2014-08-27 08:17:20

+0

非常感谢你,我得到了你想要的第一个查询的结果。再次感谢。 – user3625561 2014-08-27 10:15:25

+0

没问题,你会接受答案吗?这表明问题是完整的,并且是问题/回答过程的重要部分。 – 2014-08-27 12:03:08