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

再帰的な自己参加を行う最も簡単な方法は?

    WITH    q AS 
            (
            SELECT  *
            FROM    mytable
            WHERE   ParentID IS NULL -- this condition defines the ultimate ancestors in your chain, change it as appropriate
            UNION ALL
            SELECT  m.*
            FROM    mytable m
            JOIN    q
            ON      m.parentID = q.PersonID
            )
    SELECT  *
    FROM    q
    

    順序付け条件を追加することで、ツリーの順序を保持できます:

    WITH    q AS 
            (
            SELECT  m.*, CAST(ROW_NUMBER() OVER (ORDER BY m.PersonId) AS VARCHAR(MAX)) COLLATE Latin1_General_BIN AS bc
            FROM    mytable m
            WHERE   ParentID IS NULL
            UNION ALL
            SELECT  m.*,  q.bc + '.' + CAST(ROW_NUMBER() OVER (PARTITION BY m.ParentID ORDER BY m.PersonID) AS VARCHAR(MAX)) COLLATE Latin1_General_BIN
            FROM    mytable m
            JOIN    q
            ON      m.parentID = q.PersonID
            )
    SELECT  *
    FROM    q
    ORDER BY
            bc
    

    ORDER BYを変更する 兄弟の順序を変更できる条件。



    1. データベースから接続文字列を取得する方法

    2. SQL Serverの挿入、更新、選択の最速の方法

    3. to_char(myDate、'DAY')の結果を文字列と比較するときに問題が発生します

    4. SQL ServerでのROW_NUMBER()のしくみ