2016-08-02 40 views
0

我有一張桌子,但我無法寫出提取樹的關係。如何在Oracle中生成分層查詢?

下面是數據的一個例子:從LOT_PRODUCED = LOT_1開始

LOT_ID | LOT_PRODUCED | ITEM_PRODUCED | ITEM_USED | LOT_USED | OPERATION | STEP 
------ | ------------ | ------------- | --------- | -------- | --------- | ---- 
1  | LOT_1  | ITEM_1  | null  | null  | P   | STEP_1 
1  | null   | null   | ITEM_1 | LOT_1 | C   | STEP_2 
5  | null   | null   | ITEM_2 | LOT_2 | C   | STEP_2 
5  | LOT_2  | ITEM_2  | null  | null  | P   | STEP_8 
5  | null   | null   | ITEM_2 | LOT_2 | C   | STEP_1 
6  | null   | null   | ITEM_2 | LOT_7 | C   | STEP_8 

,我想有鏈接到起始很多步驟每一步一棵樹。

因此在本例中,我們看到STEP_1(生成LOT_1的步驟)消耗LOT_2。那一批是由STEP_8製作的。這一步反過來消耗LOT_7。等等。

我想我明白了START WITH和CONNECT BY的概念,但我無法解決這種情況,因爲鏈接在列之間「跳躍」。沒有明確的父母和孩子。

如果這不能用一個簡單的查詢解決,我打開存儲過程。

編輯:

Here is a drawing of the data shown above

所以左邊有鏈接的解釋:

  • 很多由
  • 步驟產生了很多步驟中消耗

右邊有鏈接:conn上的數字ectors是上面顯示的數據的行號。

+0

清澈如泥。哪一行顯示LOT_1消耗LOT_2?表中沒有任何行可以顯示它們之間的任何連接,可以直接或通過其他行的鏈。 (如果有的話,請解釋。) – mathguy

+0

看起來你有三個枚舉實體:批次,項目和步驟。然而,我不認爲這些事情之間的關係是清楚的 - 你會編輯你的問題來表明(粗略)這些事情是什麼。它看起來像一個步驟_produces_一個項目,一個步驟_uses_一個項目,以及一個步驟_uses_很多。你能澄清嗎? – halfer

+0

您可能會發現嵌入在您的問題中的圖形表示有助於說明問題。 – halfer

回答

0

,我想出了一個查詢:

SELECT DISTINCT G.STEP, 
    LOT_USED, 
    ITEM_USED, 
    LOT_PRODUCED, 
    ITEM_PRODUCED 
FROM GENEALOGY G 
    START WITH G.STEP  = 'STEP01' 
    CONNECT BY LOTPRODUCED = PRIOR LOTUSED 
AND ITEMPRODUCED   = PRIOR ITEMUSED 
ORDER BY G.STEP 

但這僅返回消耗的第一級:從開始步驟 ,我被消耗很多,然後爲這些大量的,我得到產生它的步驟。如果有的話,我也可以獲得開始階段生產的批次。

要與我的示例數據,我得到(從STEP_1開始)鏈接:

STEP | LOT_USED | ITEM_USED | LOT_PRODUCED | ITEM_PRODUCED 
-------|----------|-----------|--------------|--------------- 
STEP_1 | LOT_2 | ITEM_2 |    | 
STEP_1 |   |   | LOT_1  | ITEM_1 
STEP_8 |   |   | LOT_2  | ITEM_2 

我再變查詢到包括現有的部分作爲一個子查詢:

SELECT DISTINCT H.STEP, 
    LOTUSED, 
    ITEMUSED, 
    LOTPRODUCED, 
    ITEMPRODUCED 
FROM GENEALOGY H 
    START WITH H.STEP IN 
    (SELECT DISTINCT G.STEP 
    FROM GENEALOGY G 
     START WITH G.STEP = 'STEP_1' 
     CONNECT BY LOTPRODUCED = PRIOR LOTUSED 
    AND ITEMPRODUCED   = PRIOR ITEMUSED 
    ) 
    CONNECT BY LOTPRODUCED = PRIOR LOTUSED 
AND ITEMPRODUCED   = PRIOR ITEMUSED 
ORDER BY H.STEP 

我然後獲得2個級別的消費。

要與我的示例數據鏈接,我獲得(來自STEP_1開始):

STEP | LOT_USED | ITEM_USED | LOT_PRODUCED | ITEM_PRODUCED 
-------|----------|-----------|--------------|--------------- 
STEP_1 | LOT_2 | ITEM_2 |    | 
STEP_1 |   |   | LOT_1  | ITEM_1 
STEP_8 |   |   | LOT_2  | ITEM_2 
STEP_8 | LOT_7 | ITEM_2 |    | 

這樣我就可以得到消費的CONNECT的許多級別由存在於查詢。 但我當然想要得到完整的樹。 我不知道提前多少級別,即使我知道它是例如30,我的查詢將是「巨大的」沒有理由。

有人有一個想法來幫助我爲我的問題構建更簡單的查詢嗎? 也許使用P(產生)和C(消耗)操作字段和LOT_ID?