在分层SQL查询中,如何删除不满足条件的行的子项?

问题描述 投票:0回答:1
SELECT rep.*,
       rank() OVER (PARTITION BY rep.ASSEMBLY_ID
                    ORDER BY CASE WHEN rep.state_code = 'PUBLISH' THEN 1 ELSE 2 END) rnk
FROM
    (SELECT * 
       FROM TABLE T
       START WITH T.SCENARIO_ID = <SCENARIO_ID>
       CONNECT BY PRIOR T.COMPONENT_ID = T.ASSEMBLY_ID
    )rep WHERE rep.rnk = 1

上面的查询构建了项目结构的层次结构,其中组件 A 的组件是其他组件的父组件。在该层次结构中,我只想选择那些根据“STATE_CODE”排名为 1 的程序集,对于层次结构中的父节点,该程序集可以是“PUBLISH”或“ROLLUP”。我可以使用 RANK 函数实现它,但无法限制 RANK 为 1 以外的程序集的子行。有关如何通过在 CONNECT BY OPERATOR 中引入排名函数来限制子行的任何输入,请进行查询仅当程序集排名为 1 时才执行 CONNECT BY 操作

sql oracle-database hierarchical
1个回答
0
投票

使用 CTE 计算排名,并在

rnk = 1
START WITH
子句中包含
CONNECT BY
条件。

WITH ranked_T AS (
    SELECT T.*,
           RANK() OVER (PARTITION BY T.ASSEMBLY_ID
                        ORDER BY CASE WHEN T.STATE_CODE = 'PUBLISH' THEN 1 ELSE 2 END) AS rnk
    FROM T
)
SELECT *
FROM ranked_T
START WITH ranked_T.SCENARIO_ID = <SCENARIO_ID> AND ranked_T.rnk = 1
CONNECT BY PRIOR ranked_T.COMPONENT_ID = ranked_T.ASSEMBLY_ID
           AND ranked_T.rnk = 1;
© www.soinside.com 2019 - 2024. All rights reserved.