2011-01-20 3 views
1

저는 처음부터 데이터를 얻기 위해 연결 문을 사용하여 모든 부모 - 자식을 얻고 있지만 그저 각 자녀에 대한 최종 부모. 는 예를 위해 난 그냥오라클을 사용하여 각 자식에 대한 최종 부모를 얻고 싶습니다. 문으로 시작합니다.

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 

어떤 몸이 좀 도와 수 그래서 내가 출력을 원하는 다음 데이터
child --> parent 
a ------> b, 
b ------> c, 
c ------> d, 
c ------> e 

있습니다.

답변

0

하드 코드 ('쉽게 해결할 수있는 루트') '또는 여러 개의 뿌리에 대한보다 일반적인 해결책을 원할지 여부가 명확하지 않습니다. 당신이 어떤 루트에 대한보다 일반적인 솔루션을 원하는 경우

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; 

는이

편집는, 부모에 대한 null 일 수 없습니다 도움이 될 수 있습니다 :

을 전 가정하면, 다음이 당신이 가고 얻을 수 있습니다
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; 
+0

답장을 보내 주셔서 감사합니다. 나는 특정 가치를 위해 그것을 하드 코딩하고 싶지 않다. 나는 그것을 일반적으로 만들고 싶다. 당신이 "child_parent values ​​(null, 'a');에 삽입 한 것처럼 값을 입력 할 수 없다. –

+0

null로 부모를 입력 할 수 없다면 부모를 어떻게 식별합니까? –

+0

그냥 열 값을보고. 'a'에 대한 부모를 나타내는 행이 없으면 'a'에 부모가 없음을 의미합니다. –