2016-10-28 7 views
-4

私はこの質問に対する答えを探していました。私はノードのpidと親pid(ppid)を含む別の列を含む "ツリー"と呼ばれるテーブルがあります。そして、表には含まれています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 

目的は、/ Oracleを使用する単一のクエリでは、ノードの種類を明記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 

: 出力は次のようなものであると考えられます。誰か助けてくれますか? は、事前にありがとう:)

+5

は、MySQL、SQLサーバーまたはOracle?、1つを選択 – Lamak

+2

** Oracle/sql/sql server/etcを使用した単一のクエリ** **実際には –

+1

そして、あなたがどこにいるのか、どの特定の部分にこだわっているのかを教えてください。 –

答えて

0

SQL SERVER & Oracleでは、これは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 

結果ですRecursive CTE

を使用して達成することができますので

╔═════╦═══════╗ 
║ 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

列名の行をスキップするにはどうすればよいですか? –

関連する問題