2017-12-13 14 views
1

나는 계층 적 테이블로 재귀 쿼리를 사용하는 방법을 알아 내려고하고있다. 주어진 레코드의 조상을 가져와야하며, 레코드는 계층 구조에서 레벨의 순서에 따라 정렬되어야합니다. 즉, 첫 번째 레코드가 최상위 노드 여야하며 그 다음 레코드는 질의되는 레코드의 하위 노드가되어야합니다.sqlite 재귀 조상 쿼리

다음 데이터가있는 "food"라는 테이블을 고려하십시오. 상위 레코드를 제외한 모든 레코드가 상위 레코드를 갖는 단순한 계층 구조입니다.

id   | parent 
-----------+--------- 
top  | 
fruit  | top 
red  | fruit 
cherry  | red 
apple  | red 
orange  | fruit 
clementine | orange 
mandarin | orange 

내가 함께 만다린 기록 자체를 포함하여 "만다린"레코드에 대한 모든 조상을 제공하는 다음 쿼리를 자갈길, 주제에 여러 웹 페이지를 이해하려고 노력. 수준 아래로

fruit 
mandarin 
orange 
top 

내가 기록을하고 싶습니다 먼저 최고 기록으로 분류 될 :

with recursive 
    child_record(id) as (
     values('mandarin') 

     union 

     select parent 
     from food, child_record 
     where food.id = child_record.id 
    ) 
select id from food 
    where food.id in child_record; 

그러나, 그 쿼리는 임의의 순서로 나에게 표시되는 내용의 레코드를 반환 만다린 기록에.

top 
fruit 
orange 
mandarin 

내가 원하는 순서대로 레코드를 제공하려면 어떻게 구성해야합니까?

답변

0

나는 ROWID에 의해 순서를 제안한다

with recursive 
    child_record(id) as (
     select 'mandarin' 

     union 

     select parent 
     from food, child_record 
     where food.id = child_record.id 
    ) 
select id from food 
    where food.id in child_record 
    order by food.rowid; 
1

내가 나는 그것을 생각? 나는 아직도 구문을 이해하지 못하기 때문에 내가하는 말을 망설이지 만 다음 쿼리는 내가 원하는 결과를 만들어 낸다.

with recursive 
    child_record(level, id) as (
     values(0, 'mandarin') 

     union 

     select child_record.level+1, food.parent 
     from food, child_record 
     where food.id = child_record.id 
    ) 
select child_record.level, food.id 
from food, child_record 
where food.id = child_record.id 
order by child_record.level desc;