oracle 临时表上的分层查询可以正常工作,但结果排序不正确

q35jwt9p  于 2022-12-03  发布在  Oracle
关注(0)|答案(3)|浏览(148)

我有一个分层查询:

with temp1 as (
select distinct 
    b.ID,
    b.LABEL,
    b.parent_id
from my_table b
where b.PROG_MODIF_ID=:P225_PROG_MODIF
)
,temp2 as (
select distinct 
    b.ID,
    b.LABEL,
    p.id as p_id,
    b.parent_id
from temp1 b
left join temp1 p on p.id=b.parent_id
)
select distinct 
    b.ID,
    b.p_id,
    b.LABEL,
    b.parent_id
from temp2 b

start with b.p_id is null
connect by
prior b.id=b.p_id

我用这个查询得到的结果是正确的,但是它们没有按需要排序:意味着每个父节点及其下面的子节点,相反,即使“父节点-子节点”链接被指定为b.id=b.p_id,它们也是随机排序的
编辑:查询一开始有order siblings by b.id,但它不起作用,相反,它是排序的父母和兄弟姐妹都一样,结果是父母在中间或低于他们的孩子。编辑2:我发现问题是我在查询中使用的一个CASE,不知何故,当我添加那个CASE列时,顺序变得疯狂,当我删除它时,它工作得很好...

bvn4nwqk

bvn4nwqk1#

您应该能够使用ORDER SIBLINGS BY子句将其简化为单个分层查询:

SELECT DISTINCT
       id,
       label,
       PRIOR id AS p_id,
       parent_id
FROM   my_table
START WITH
       parent_id IS NULL
AND    prog_modif_id = :P225_PROG_MODIF
CONNECT BY
       PRIOR id = parent_id
AND    prog_modif_id = :P225_PROG_MODIF
ORDER SIBLINGS BY
       label

但是,如果没有minimal reproducible example,则无法进行测试。

zpqajqem

zpqajqem2#

查询的结果集没有内在顺序。如果要对记录进行排序,则需要包含ORDER BY子句

zed5wv10

zed5wv103#

我发现添加CASE列是我的查询中的问题,所以我在@MT0的建议后注解了它的查询,如下所示:

select distinct 
    b.ID,
    b.LABEL,
    b.parent_id
    --case when (select count(*) from budget_equip p where p.parent_id=b.id and p.PROG_MODIF_ID=:P225_PROG_MODIF)>0 then 'underline' else 'none' end as text_decoration
from my_table b
where b.PROG_MODIF_ID=:P225_PROG_MODIF

START WITH --p.id IS NULL
(select count(*) from budget_equip p where p.parent_id=b.id and p.PROG_MODIF_ID=:P225_PROG_MODIF)>0
CONNECT BY
       PRIOR id = parent_id
ORDER SIBLINGS BY label

我还是想不出办法绕过这个案子。

相关问题