2016-03-10 50 views
1

在給定的情景中,我們有幾個大量的入口點,我們將這些入口點混合在一箇中間產品批次中。這些中間產品批次用於其他中間產品或成品批次。在貨物和成品之間有不同數量的中間步驟。Oracle分層查詢「開始於」 - where條款中的值

要查找在指定的成品中使用的很多很多的所有我想寫一個Oracle SQL這樣的:

SELECT 
    something 
FROM (
    SELECT 
     something_else 
    FROM DB_TABLE 
    START WITH DB_TABLE.OUTPUT = START_VALUE 
    CONNECT BY NOCYCLE PRIOR DB_TABLE.OUTPUT = DB_TABLE.INPUT 
    ) QRY_NAME 
WHERE START_VALUE = '1400929801' 

我知道,這上面的例子不工作,但它說明了什麼我在找。
所以,我需要在外部查詢的where子句中定義值的開始 - 但不知道如何。
查詢將嵌入到軟件中,用戶只能在其中定義where子句。

+1

爲什麼你需要嵌套查詢? – Aleksej

+0

也許你應該解釋爲什麼你需要在外部查詢中定義起始值。聽起來像是[XY問題](http://meta.stackexchange.com/questions/66377/what-is-the-xy-problem/66378#66378)。 –

+0

外部查詢有幾個連接。我並不需要它嵌套,但減少了基數。 – Cabation

回答

0

假設你需要有某種原因外查詢的初始值,你可以嘗試以下方法:

SELECT 
    something 
FROM (
    SELECT 
     something_else, connect_by_root(DB_TABLE.INPUT) as root 
    FROM DB_TABLE 
    CONNECT BY NOCYCLE PRIOR DB_TABLE.INPUT = DB_TABLE.OUTPUT 
    ) QRY_NAME 
WHERE root = '1400929801' 

它只是執行您的查詢,添加一列以保持根值,所以您可以將其用作外部查詢中的過濾器。但是,如果您只是需要外部查詢來限制結果數量,則可以在內部查詢中使用起始值,然後使用外部查詢來限制結果集的某些條件;例如:

SELECT 
     something 
    FROM (
     SELECT 
      something_else 
     FROM DB_TABLE 
     START WITH DB_TABLE.INPUT = '1400929801' 
     CONNECT BY NOCYCLE PRIOR DB_TABLE.INPUT = DB_TABLE.OUTPUT 
     ) QRY_NAME 
    WHERE /* some condition */ 

根據您的需求,也許你甚至可以把你的限制條件在內部查詢,而無需外部之一,但它取決於如何要限制的結果集

+0

您的代碼的第一個符合我的需要,但內部查詢大約有數百萬條記錄在第一個代碼中,我放棄了過濾器和大量的性能,對此有什麼建議? – Cabation

+0

第二個代碼仍然存在相同的挑戰:如何獲得「開始」值到哪裏子句? – Cabation

+0

如果你有'START WITH'子句,你的結果是正確的限制,沒有性能問題,所以問題仍然是:爲什麼你需要使用外部查詢來限制結果集? – Aleksej