2016-06-13 50 views
0

假设我有两个表查找子: 第一个被命名为sales,并有一个名为productquantity 第二个被命名为nomenclature,并有一个名为compoundcomponent两列两列。满足一个specefic标准,ORACLE

每个compound能有几个componentscomponent可能本身就是一个compound几个components这使得第二个表的层次结构。 让我们举个例子如下表:

TABLE : SALES 
PRODUCT - QUANTITY 
    P1  - 200 
    P2  - 300 
    F3  - 400 
    P5  - 500 


TABLE : NOMENCLATURE 
COMPOUND - COMPONENT 
P1  - A1 
P1  - B2 
P2  - D4 
A1  - F6 
B2  - Q7 
D4  - F8 
Q7  - F9 
F9  - H10 
P3  - F11 

我想找到的每一行中SALES.PRODUCT在其层次结构的每个组件以F开头,并返回它们和/或如果产品本身与F或开始返回其自身否则忽略该行。最后的结果应该是这样的:

PRODUCT - QUANTITY - COMPONENT 
P1  - 200  - F6 
P1  - 200  - F9 
P2  - 300  - F8 
F3  - 400  - F3 
F3  - 400  - F11 

(因为P5被忽略不以F开始,不具有以f开头的子女)

如何做到获得这一结果PL/SQL(Oracle)的最有效的方式(命名法实际上有超过50万行)

+0

你尝试过这么远吗?你确定你的意思是PL/SQL,而不是简单的SQL? – sstan

+0

如何获得输出的最后两行? 'F11'与'P3'不匹配'F3'并且没有'F3'分量。 – MT0

+0

您可以尝试让您的示例输出反映在您给我们的示例表上吗?这将有助于更好地关联表格。你是说这个产品是一种化合物吗? – CodyMR

回答

0

你可以做这样的事情:

WITH combined (product, component, quantity) AS (
    SELECT product, product, quantity FROM sales 
UNION ALL 
    SELECT compound, component, NULL FROM nomenclature 
) 
SELECT CONNECT_BY_ROOT(product) AS product, 
     CONNECT_BY_ROOT(quantity) AS quantity, 
     component 
FROM combined 
WHERE component LIKE 'F%' 
START WITH quantity IS NOT NULL 
CONNECT BY NOCYCLE PRIOR component = product; 
+0

这工作完美!我在问题中交换了列名“组件”和“复合”,以使其更“精确”。请在第二个“SELECT”中交换组件和化合物,以使其反映我所做的更改,并在“AS”之后添加括号,以便标记已解决的问题。 –

+0

@IlyesFerchiou已更新 – MT0

相关问题