2016-09-12 3 views
1

은 내가은 (는) 이전에 연결하여 데이터의 부모를 표시합니까?

parentitem | childitem  ---table name 
    dinner  |  steak 
    dinner  |  wine 
    dinner  |  mashed potato 
    dinner  |  coffee 
    coffee  |  sugar 
    coffee  |  water 
    dinner  |  cake 
    cake  |  liquid syrup 
    cake  |  egg 

내가 '저녁 식사'내가

Select Level, LPAD('->',2*(LEVEL-1))||CHILDITEM  From table 
Start With parentitem = 'dinner' Connect By Prior childitem = 
parentitem 

가 있지만 부모를 포함 나던 FF로 코드를 사용하기 전에하여 연결하여 모든 ChildItem을 검색 할이이이 테이블이 '저녁 식사'이지만 저녁 식사의 모든 어린이 항목을 올바르게 생산하는 항목은 내 친구가 나를 조합을 사용하도록 암시했기 때문입니다. 나는 오라클을 사용하고있다.

나의 예상 된 결과는

LEVEL | CHILDITEM 
    0 | dinner 
    1 | steak 
    1 | wine 
    1 | mashed potato 
    1 | coffee 
    2 | sugar 
    2 | water 
    1 | cake 
    2 | liquid syrup 
    2 | egg 

답변

0

문제는 당신이 당신의 데이터에서 하위 항목으로 "저녁 식사"를하지 않아도이다.

만약 그렇게했다면, 그것은 START WITH childitem='dinner'의 간단한 문제 일 것입니다.

예를 들면,

당신이 "저녁 식사"자식 항목으로 나열하려면 일이, 당신의 데이터다시피
SELECT LEVEL, 
     LPAD ('->', 2 * (LEVEL - 1)) || childitem 
FROM t 
START WITH childitem = 'dinner' 
CONNECT BY PRIOR childitem = parentitem 

, 존재하지 않는 행을 생성하도록 조회를해야합니다. UNION ALL은 그 어떤 것도 좋은 방법입니다. 예를 들어,

SELECT 0 AS "LEVEL", 
     'dinner' childitem 
FROM DUAL 
UNION ALL 
SELECT LEVEL, 
     LPAD ('->', 2 * (LEVEL - 1)) || childitem 
FROM t 
START WITH parentitem = 'dinner' 
CONNECT BY PRIOR childitem = parentitem 

또 다른 방법은 원본 데이터에 누락 된 행을 만들 UNION ALL을 사용하는 것입니다. 예 :

SELECT LEVEL, 
     LPAD ('->', 2 * (LEVEL - 1)) || childitem 
FROM (SELECT NULL parentitem, 
       'dinner' childitem 
     FROM DUAL 
     UNION ALL 
     SELECT parentitem, 
       childitem 
     FROM t) t 
START WITH childitem = 'dinner' 
CONNECT BY PRIOR childitem = parentitem