Oracle10g 我想使用OracleConnect-by,start-with语句只获取每个子级的最终父级

Oracle10g 我想使用OracleConnect-by,start-with语句只获取每个子级的最终父级,oracle10g,connect-by,Oracle10g,Connect By,我使用STARTWITH,CONNECTBY语句递归地获取数据,我获取所有的父-子对象,但我只想获取每个子对象的最终父对象。 例如,我有以下数据 child --> parent a ------> b, b ------> c, c ------> d, c ------> e 所以我只想要输出 a --> d, and a --> e 我的问题是 SELECT LEVEL, cp.child, cp.parent FROM child_pare

我使用STARTWITH,CONNECTBY语句递归地获取数据,我获取所有的父-子对象,但我只想获取每个子对象的最终父对象。 例如,我有以下数据

child --> parent
a ------> b,
b ------> c,
c ------> d,
c ------> e
所以我只想要输出

a --> d,
and a --> e
我的问题是

SELECT  LEVEL, cp.child, cp.parent FROM child_parent cp
CONNECT BY nocycle PRIOR cp.parent= cp.child
START WITH cp.child= a

任何人都可以帮我解决这个问题。

不清楚您是想硬编码根“a”(这使解决方案更简单),还是想为多个根提供更通用的解决方案。假设是前者,那么这可能会让你继续:

create table child_parent (
  parent varchar2(2),
  child  varchar2(2)
);

insert into child_parent values (null, 'a');
insert into child_parent values ( 'a', 'b');
insert into child_parent values ( 'b', 'c');
insert into child_parent values ( 'c', 'd');
insert into child_parent values ( 'c', 'e');
insert into child_parent values (null, 'k');
insert into child_parent values ( 'k', 'l');
insert into child_parent values ( 'l', 'm');
insert into child_parent values ( 'l', 'n');

with choose_root_here as (
  select 'a' as root from dual
)
select
  choose_root_here.root || '->' || child from
(
  select 
    level             lvl, 
    connect_by_isleaf leaf,
    cp.parent,
    cp.child  
  from 
    child_parent cp 
  connect by nocycle prior cp.child= cp.parent
  start with 
    cp.child='a'
)
cross join choose_root_here
where
  leaf = 1;
如果您想为任何根目录提供更通用的解决方案,这可能会有所帮助

编辑,对于父项,不能为空:

select
  substr(regexp_replace(path, '##(\w+).*##(\w+)', '\1->\2'),1,30) path
  from (
      select 
        level             lvl, 
        substr(sys_connect_by_path(child, '##'),1,20) path,
        connect_by_isleaf leaf,
        cp.parent,
        cp.child  
      from 
        child_parent cp 
      connect by nocycle prior cp.child= cp.parent
      start with 
        cp.parent is null
  )
  where leaf = 1;

谢谢你的回复,很抱歉没有说清楚。我不想硬编码它的具体价值,我想使它一般。还有一件事,我不能像您那样在表中输入null值“insert into child_parent values(null,'a');”。如果不能用null值输入parents,如何识别parents?只需查看列值即可。如果没有一行显示“a”的父级,这意味着“a”没有父级。您提供的解决方案给出了输出b->d,b->e,l->m,l->n。但是我想要每个子级的最终父级,比如(子级->父级)n->k,m->k,l->k,e->a,d->a,c->a,b->a如何得到它?如果我插入并运行第二个查询,它会返回a->da->ek->mk n