2016-10-28 2 views
-4

나는이 질문에 대한 해답을 찾고있다. 노드의 pid 및 부모 pid (ppid)가 포함 된 다른 열이 포함 된 "Tree"라는 테이블이 있습니다. 그리고 테이블이 포함sql의 각 출력 행 옆에 문자열을 출력 하시겠습니까?

Pid  Ppid 
1   2 
3   2 
5   6 
7   6 
2   4 
6   4 
4   15 
8   9 
10  9 
12  13 
14  13 
9   11 
13  11 
11  15 
15  NULL 

목표는 다음 노드, 즉 "리프"의 유형을 진술는 PID 컬럼에 메시지를 인쇄하는 것입니다, 단일 쿼리에서 "내부"또는 "루트"오라클을 사용하여/sql/sql 서버/etc. 출력은이 같은 있어야하는데 : 난 그냥 새로운 열 값을 인쇄하는 방법을 알 필요가

1   Leaf 
2   Inner 
3   Leaf 
4   Inner 
5   Leaf 
6   Inner 
7   Leaf 
8   Leaf 
9   Inner 
10  Leaf 
11  Inner 
12  Leaf 
13  Inner 
14  Leaf 
15  Root 

. 누군가 나를 도울 수 있습니까? 그것이 이것은 Recursive CTE

을 사용하여 달성 할 수 SQL SERVER & Oracle에서 사전 :

+5

, MySQL은, SQL 서버 또는 오라클?, 하나 선택 – Lamak

+2

** 오라클/sql/sql 서버/etc를 사용하는 단일 쿼리 ** ** 실제로 –

+1

그리고 나서 우리가 어디서 특정 부분에 갇혀 있는지 보여주십시오. –

답변

0

에 감사 SQL SERVER

;WITH data 
    AS (SELECT * 
     FROM (VALUES (1,2), 
         (3,2), 
         (5,6), 
         (7,6), 
         (2,4), 
         (6,4), 
         (4,15), 
         (8,9), 
         (10,9), 
         (12,13), 
         (14,13), 
         (9,11), 
         (13,11), 
         (11,15), 
         (15,NULL)) tc (Pid, Ppid)), 
    rec_cte 
    AS (SELECT * 
     FROM data 
     UNION ALL 
     SELECT d.* 
     FROM rec_cte rc 
       JOIN data d 
        ON rc.Ppid = d.Pid) 
--select * from rec_cte 
    SELECT Pid, 
      CASE Count(Ppid) 
      WHEN 0 THEN 'root' 
      WHEN 1 THEN 'leaf' 
      ELSE 'inner' 
      END level 
    FROM rec_cte 
    GROUP BY Pid 

결과에 대한 : 그래서

╔═════╦═══════╗ 
║ Pid ║ level ║ 
╠═════╬═══════╣ 
║ 1 ║ leaf ║ 
║ 2 ║ inner ║ 
║ 3 ║ leaf ║ 
║ 4 ║ inner ║ 
║ 5 ║ leaf ║ 
║ 6 ║ inner ║ 
║ 7 ║ leaf ║ 
║ 8 ║ leaf ║ 
║ 9 ║ inner ║ 
║ 10 ║ leaf ║ 
║ 11 ║ inner ║ 
║ 12 ║ leaf ║ 
║ 13 ║ inner ║ 
║ 14 ║ leaf ║ 
║ 15 ║ root ║ 
╚═════╩═══════╝ 
+0

여기에서 "데이터"는 "트리 "? –

+0

@PrakharSaxena - 예 .. 데모 용 테이블 값 생성자를 사용했습니다. 테이블 이름으로 바꾸십시오. –

+0

열 이름 행을 건너 뛰려면 어떻게합니까? –

관련 문제