Member 7673567 Ответов: 1

Преобразование CTE в временную таблицу в SQL, чтобы получить все возможные родители


У меня есть одна пользовательская таблица, в которой я поддерживаю отношения родитель-потомок, и я хочу сгенерировать результат со всеми идентификаторами пользователя вместе с его parentid и всеми возможными иерархическими родителями в виде разделенных комами строк, моя структура таблицы выглядит следующим образом.

CREATE TABLE [hybarmoney].[Users](
    [ID] [bigint] IDENTITY(1,1) NOT NULL,   
    [USERID] [nvarchar](100) NULL,
    [REFERENCEID] [bigint] NULL 
)


и я получаю результат, используя приведенный ниже CTE

;WITH Hierarchy (
    ChildId
    ,ChildName
    ,ParentId
    ,Parents
    )
AS (
    SELECT Id
        ,USERID
        ,REFERENCEID
        ,CAST('' AS VARCHAR(MAX))
    FROM hybarmoney.Users AS FirtGeneration
    WHERE REFERENCEID = 0

    UNION ALL

    SELECT NextGeneration.ID
        ,NextGeneration.UserID
        ,Parent.ChildId
        ,CAST(CASE 
                WHEN Parent.Parents = ''
                    THEN (CAST(NextGeneration.REFERENCEID AS VARCHAR(MAX)))
                ELSE (Parent.Parents + ',' + CAST(NextGeneration.REFERENCEID AS VARCHAR(MAX)))
                END AS VARCHAR(MAX))
    FROM hybarmoney.Users AS NextGeneration
    INNER JOIN Hierarchy AS Parent ON NextGeneration.REFERENCEID = Parent.ChildId
    )
SELECT *
FROM Hierarchy
ORDER BY ChildId
OPTION (MAXRECURSION 0)


Но у меня есть ограничение MAXRECURSION, и когда я погуглил, я узнал, что временные таблицы-это альтернативное решение, но я не смог сделать то же самое, а также я не хочу получать все возможные верхние родители, для моей цели я хочу найти 15 уровней иерархических родителей для каждого пользователя. Можно ли использовать временные таблицы для моей цели, если это возможно, как.

Что я уже пробовал:

Я пробовал использовать только CTE, как уже упоминалось выше

Maciej Los

Вы можете отбросить результат CTE во временную таблицу с помощью инструкции SELECT INTO.
Что за проблема у вас возникла? "У меня есть ограничение MAXRECURSION" вообще не является описательным.

1 Ответов

Рейтинг:
0

Maciej Los

Пожалуйста, сначала прочтите мой комментарий к этому вопросу.

Я считаю, что с вашим CTE что-то не так, потому что, когда вы устанавливаете MAXRECURSION опцион на 0 (ноль), это позволяет создать inifinite цикл. Максимальное значение для MAXRECURSION является 32767.

Ниже CTE выполняется правильно, даже если он повторяется почти 40000 раз.

WITH NumbersCTE AS
(
    SELECT  1 AS Number
    UNION ALL
    SELECT Number + 1 FROM NumbersCTE  
    WHERE  Number < 40000
 )
SELECT * FROM NumbersCTE
OPTION (MAXRECURSION 0)


Для получения более подробной информации, пожалуйста, смотрите: MAXRECURSION Sql Server | SqlHints.com[^]