Sqlserver
 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. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Динамично създаден SQL срещу параметри в SQL Server

  2. Проблем при използване на ROW_NUMBER() OVER (PARTITION BY ...)

  3. Име на колони за променлива на SQL Server?

  4. Защо UDF е толкова по-бавен от подзаявката?

  5. Как да посоча колона да бъде уникална в обхвата на връзка в SQL Server 2008?