2016-06-13 51 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

相關問題