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

SQL Server2008CTE再帰

    それほど難しいことではありません:

    ;WITH cte AS
    (
        SELECT CAST('/' + Name AS VARCHAR(50)) as 'CteName', ID
        FROM dbo.YourTable
        WHERE parent_id IS NULL
    
        UNION ALL
    
        SELECT CAST(cte.CteName + '/' + Name AS VARCHAR(50)), t.ID
        FROM dbo.YourTable t
        INNER JOIN cte ON t.parent_id = cte.id
    )
    SELECT cteName FROM cte
    ORDER BY ID
    

    次の出力が表示されます:

    /A
    /A/B
    /A/B/C
    /A/D
    

    補足として:「深さ」はCTEによって簡単に計算でき、必ずしもテーブルに保存する必要はありません(Levelを参照)。 追加した列):

    ;WITH cte AS
    (
        SELECT 
           CAST('/' + Name AS VARCHAR(50)) as 'CteName', ID, 
           1 AS 'Level'
        FROM dbo.YourTable
        WHERE parent_id IS NULL
    
        UNION ALL
    
        SELECT 
           CAST(cte.CteName + '/' + Name AS VARCHAR(50)), t.ID,
           cte.Level + 1 AS 'Level'
        FROM dbo.YourTable t
        INNER JOIN cte ON t.parent_id = cte.id
    )
    SELECT cteName FROM cte
    ORDER BY Level, ID
    


    1. 明示的に注文してデッドロックを回避する

    2. uidにもかかわらずDjangopostsaveシグナルが2回呼び出される

    3. SQL Serverのsys.views、sys.system_views、およびsys.all_viewsの違い

    4. php:Oracleドライバをロードするとエラーが発生しますダイナミックライブラリをロードできません-指定されたプロシージャが見つかりませんでした。