sql >> データベース >  >> RDS >> Sqlserver

T/SQLでの再帰的な子/親クエリ

    最後に並べ替えることができるものを作成するには、再帰が必要です:

    declare @t TABLE (
    [CHILD] [int] NOT NULL,
    [PARENT] [int] NOT NULL
    ) 
    
    insert @t values
    ( 0, -1),   -- I added this
    ( 1, 2 ),
    ( 2, 0 ),
    ( 3, 1 ),
    ( 4, 2 ),
    ( 5, 0 )
    

    (真のルート要素を追加したことに注意してください)

    ;with n(CHILD, PARENT, GENERATION, hierarchy) as (
    select CHILD, PARENT,0, CAST(CHILD as nvarchar) as GENERATION from @t
    where PARENT=-1
    union all
    select nplus1.CHILD, nplus1.PARENT, GENERATION+1, 
    cast(n.hierarchy + '.' + CAST(nplus1.child as nvarchar) as nvarchar)
     from 
    @t as nplus1 inner join n on nplus1.PARENT=n.CHILD 
    )
    select CHILD,GENERATION
    from n
    order by hierarchy
    

    返品

    CHILD       GENERATION
    ----------- -----------
    0           0
    2           1
    1           2
    3           3
    4           2
    5           1
    

    hierarchyを含む 説明のために:

    CHILD       GENERATION  hierarchy
    ----------- ----------- ------------------------------
    0           0           0
    2           1           0.2
    1           2           0.2.1
    3           3           0.2.1.3
    4           2           0.2.4
    5           1           0.5
    

    IDの大きさによっては、並べ替えを正しく行うために、ゼロを使用した左パディングを使用する必要がある場合があります。

    SQL2008には組み込みのhierarchyがあることに注意してください。 この種のタイプ...



    1. 行androidを更新するSqliteデータベース

    2. sqliteデータベースをSDカードに直接保存する方法

    3. 複数のカーソルからOracleストアドプロシージャから複数の行を返す方法は?

    4. MysqlからAndroidアプリケーションのデータを一覧表示できません