2017-02-20 6 views
-1

私は、このようなテーブルを有する取得方法SQL Server 2008を使用してsub_ofのレベル数を取得しますか?

|id | Name |sub_of| 
|1 |Level 1A| 0 | 
|2 |Level 1B| 0 | 
|3 |Level 1C| 0 | 
|4 |Level 1D| 0 | 
|5 |Level 2A| 1 | 
|6 |Level 2B| 2 | 
|7 |Level 2C| 3 | 
|8 |Level 3C| 7 | 
|9 |Level 4C| 8 | 
|10 |Level 5C| 9 | 
|11 |Level 3B| 6 | 


Iこの場合

  • A有する2つのレベル
  • B有する3つのレベル
  • 1つのレベルを有するdは5つの段階
  • を有するcは

Sub_ofは前のレベルのIDです。名前にsub_of nameは含まれていません(つまり、AにはすべてのレベルのAが含まれていません)。

私は最大レベルのsub_ofが必要です。いくつか考えてください。

+0

を、それがどのように見えるべきかのように、出力結果のサンプルで提供されるものですか。 – balaji

+0

ちょうど私は行の最大数とその数を持っている必要があります。値0のsub_ofが私たちのマスター行で、他の行がマスター行の下位であることを意味します。 –

+0

には、たとえばレベルAのすべての行を識別するフィールドがありますか? – McNets

答えて

1

あなたは私がsub_of =最初のIDを使用しました再帰CTEのクエリを使用して、各レベルの一意の識別子(A、B、C、...)

が必要0をユニークな識別子として使用:

;WITH tree AS 
(
    SELECT c1.id, c1.name, c1.sub_of, [id_level] = c1.id, [level] = 1 
    FROM dbo.[btree2] c1 
    WHERE c1.sub_of = 0 
    UNION ALL 
    SELECT c2.id, c2.name, c2.sub_of, [id_level] = tree.[id_level], [level] = tree.[level] + 1 
    FROM dbo.[btree2] c2 INNER JOIN tree ON c2.sub_of = tree.id 
) 
SELECT t1.id, t1.sub_of, t1.name, t1.id_level, t1.level 
FROM tree t1 
    INNER JOIN (SELECT id_level, MAX(level) AS level FROM tree GROUP BY id_level) t2 
    ON t1.id_level = t2.id_level AND t1.level = t2.level 
ORDER BY id_level, level 
OPTION (MAXRECURSION 0) 
; 

次に、各グループに対してMAX(レベル)を取得します。

+----+--------+----------+----------+-------+ 
| id | sub_of | name  | id_level | level | 
+----+--------+----------+----------+-------+ 
| 5 | 1 | Level 2A |  1 | 2 | 
| 11 | 6 | Level 3B |  2 | 3 | 
| 10 | 9 | Level 5C |  3 | 5 | 
| 4 | 0 | Level 1D |  4 | 1 | 
+----+--------+----------+----------+-------+ 

ここでそれを確認してください:http://rextester.com/KIEY97438

2

再帰CTEは

DECLARE @T as TABLE 
(
    id int, 
    Name varchar(10), 
    sub_of int 
) 

INSERT INTO @T VALUES 
(1 ,'Level 1A',0), 
(2 ,'Level 1B',0), 
(3 ,'Level 1C',0), 
(4 ,'Level 1D',0), 
(5 ,'Level 2A',1), 
(6 ,'Level 2B',2), 
(7 ,'Level 2C',3), 
(8 ,'Level 3C',7), 
(9 ,'Level 4C',8), 
(10 ,'Level 5C',9), 
(11 ,'Level 3B',6) 

くださいは私たちにあなたの将来の質問では、このステップを保存)

サンプルテーブルを作成し、移入... CTEあなたの友達です:

;WITH CTE AS 
(
    SELECT id, Name, Sub_Of, 0 As Level 
    FROM @T 
    WHERE Sub_Of = 0 

    UNION ALL 
    SELECT t.id, t.Name, t.Sub_Of, Level + 1 
    FROM @T as t 
    INNER JOIN CTE ON t.Sub_Of = CTE.id 
) 

クエリ:

SELECT * 
FROM CTE 
ORDER BY Level DESC 

結果:

id Name  Sub_Of Level 
10 Level 5C 9  4 
9 Level 4C 8  3 
11 Level 3B 6  2 
8 Level 3C 7  2 
7 Level 2C 3  1 
6 Level 2B 2  1 
5 Level 2A 1  1 
1 Level 1A 0  0 
2 Level 1B 0  0 
3 Level 1C 0  0 
4 Level 1D 0  0 
+0

今後の質問には、これらのステップが必要です。お気軽に。 –

+0

素晴らしい。お役に立てて嬉しいです。 –

関連する問題