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

CTE 再帰の深さを制限するが汎用テーブルを選択する方法は?

    レベル フィールドでやりたいことが再帰の数を制限することだけである場合は、 MAXRECURSION クエリのヒント 、次のようなもの:

    WITH Department_CTE AS
    (
        SELECT
            DepartmentGroupKey,
            ParentDepartmentGroupKey,
            DepartmentGroupName
        FROM dimDepartmentGroup
        WHERE DepartmentGroupKey = 2
        UNION ALL
        SELECT
            Child.DepartmentGroupKey,
            Child.ParentDepartmentGroupKey,
            Child.DepartmentGroupName
        FROM Department_CTE AS Parent
            JOIN DimDepartmentGroup AS Child
                ON Parent.ParentDepartmentGroupKey = Child.DepartmentGroupKey
    )
    SELECT * FROM Department_CTE
    OPTION (MAXRECURSION 2)
    

    編集:

    コメントの質問への回答では、いいえ、MAXRECURSION 設定で許可されている回数を超えて再帰するときに発生するエラーを抑制することはできません。私の理解が正しければ、次のようなことができます:

    WITH CTE AS
    (
        -- Start CTE off by selecting the task that was provided to stored procedure.
        SELECT Id, 0 as [Level]
        FROM [dbo].[TestTable]
        WHERE [Id] = 1
        -- Recursively add tasks that are children of parent tasks that have already been found in previous iterations.
        UNION ALL
        SELECT t.Id, [Level] + 1
        FROM [dbo].[TestTable] as t
        INNER JOIN CTE as tcte
            ON t.[ParentId] = tcte.[Id]
        WHERE [Level] < 2
    ),
    CTE2 AS
    (
        SELECT TestTable.*
        FROM CTE
            INNER JOIN TestTable ON CTE.Id = TestTable.Id
    )
    SELECT * FROM CTE2;
    

    階層または主キー フィールドを変更する予定がないと仮定すると、これは上記と同様に一般的なものにする必要があります。




    1. グループのサブグループにCOUNT関数を適用します

    2. Mysql配列が機能しない

    3. '挿入'関数がMySQLdbを使用して行を追加しないのはなぜですか?

    4. SQL:値がnullの場合にのみ、列の値を更新するにはどうすればよいですか?