Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Jak ograniczyć głębokość rekurencji CTE, ale wybrać tabelę ogólną?

Jeśli wszystko, co chcesz zrobić z polem poziomu, to ograniczyć liczbę rekursji, powinieneś być w stanie użyć MAXRECURSION podpowiedź do zapytania , coś takiego:

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)

Edycja:

W odpowiedzi na pytanie w komentarzach:nie, nie możesz pominąć błędu, który pojawia się, gdy powtarzasz więcej razy, niż pozwala na to ustawienie MAXRECURSION. Jeśli dobrze cię rozumiem, możesz zrobić coś takiego:

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;

Powinno to być równie ogólne jak to, co masz powyżej, zakładając, że nie planujesz zmieniać hierarchicznych lub podstawowych pól klucza.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Używanie SMO do kopiowania bazy danych i danych

  2. Pobieranie wartości logicznej z daty porównaj w t-sql select

  3. Przekazywanie tablicy intów do przechowywanego proc T-SQL za pośrednictwem struktury encji

  4. Zapytanie o przekształcenie SQL

  5. T-SQL - WYBIERZ według najbliższej daty i GROUPED BY ID