1

私はそのようなテーブルを持っています

ID               Node                  ParentID
1                 A                        0
2                 B                        1
3                 C                        1
4                 D                        2
5                 E                        2
6                 F                        3
7                 G                        3
8                 H                        3 
9                 I                        4
10                J                        4
11                K                        10
12                L                        11

特定のノードの深さを示す「レベル」フィールドを生成するクエリが必要です。以下の例

ID               Node                  ParentID                  Level
1                 A                        0                         1
2                 B                        1                         2
3                 C                        1                         2
4                 D                        2                         3
5                 E                        2                         3
6                 F                        3                         4
7                 G                        3                         4
8                 H                        3                         4 
9                 I                        4                         5
10                J                        4                         5
11                K                        10                        6
12                L                        11                        7
4

6 に答える 6

1

これを試して

CREATE TABLE #Table1
    ([ID] int, [Node] varchar(1), [ParentID] int)
;

INSERT INTO #Table1
    ([ID], [Node], [ParentID])
VALUES
    (1, 'A', 0),
    (2, 'B', 1),
    (3, 'C', 1),
    (4, 'D', 2),
    (5, 'E', 2),
    (6, 'F', 3),
    (7, 'G', 3),
    (8, 'H', 3),
    (9, 'I', 4),
    (10, 'J', 4),
    (11, 'K', 10),
    (12, 'L', 11)
;

;WITH CTE ([ID], [ParentID], [Node], [Level])
as (
    SELECT [ID], [ParentID], [Node], 1 FROM #Table1 WHERE ParentID = 0
    UNION all
    select t.[ID], t.[ParentID], t.[Node], 1 + c.[Level]
    from CTE c inner join #Table1 t ON t.[ParentID] = c.[ID]
)
select ID, [Node], [ParentID], [Level] from CTE
ORDER BY [Node]


DROP TABLE #Table1
于 2013-07-24T09:30:02.367 に答える
1
Select Id,
       Node,
       ParentID,
       Dense_Rank() Over(Order by ParentID) as Level 
       from Table_Name

SQL フィドルのデモ

于 2013-07-24T08:54:15.600 に答える
1

それを行う正しい方法は、親レベルを取得し、データを挿入するときに1ずつ増やすことだと思います。他のすべての方法はパフォーマンスが高いためです。

于 2013-07-24T09:01:31.960 に答える
1

ParentIDここでは、グループ化してレベルを設定し、両方のテーブルを で結合する必要がありますParentID

WITH CTE (ParentID, Level)
AS (
    SELECT ParentID
         , Row_Number() OVER (ORDER BY ParentID) AS Level
      FROM Table1
     GROUP BY ParentID
)
SELECT t1.ID, t1.Node, t1.ParentID, CTE.Level
FROM Table1 t1 
JOIN CTE ON t1.ParentID = CTE.ParentID;

このSQLFiddleを参照してください


更新:(MySQLの場合-他の人を助けるためだけに)

MySQL で同じことを行うには、次のように行番号を取得してみてください。

SELECT t1.ID, t1.Node, t1.ParentID, Tbl.Level
FROM Table1 t1 
JOIN
(
  SELECT @Level:=@Level+1 AS Level , ParentID 
  FROM (SELECT DISTINCT ParentID FROM Table1) t
, (SELECT @Level:=0) r
 ORDER BY ParentID
) Tbl
 ON t1.ParentID = Tbl.ParentID;

このSQLFiddleを参照してください

于 2013-07-24T09:23:37.597 に答える