Oracle子层次查询“start with” - where子句中的值

时间:2016-03-10 16:07:49

标签: oracle where-clause connect-by

在给定的情景中,我们将几种成分混合到中间产品批次中。这些中间产品批次用于进一步的中间产品或成品批次。在成分和成品之间存在不同量的中间步骤。

要查找给定成品批次中使用的所有批次,我想编写如下的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子句中定义start的值 - 但是不知道如何。
查询将嵌入到软件中,用户只能定义where子句。

1 个答案:

答案 0 :(得分: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 */

根据您的需要,您甚至可以在内部查询中设置限制条件,而不使用外部查询,但这取决于 您希望如何限制结果集