Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Requête récursive où l'ancre et le membre ont des unions

Vous ne pouvez pas vous référer à mainMenu plus d'une fois. Et cela est dû au fait que vous avez en fait deux expressions d'ancrage, une pour les rôles et une pour les utilisateurs. Il existe deux façons de résoudre ce problème. Vous pouvez diviser votre requête en deux CTE (un pour les rôles, un pour les utilisateurs). Comme ceci :

with
roleMainMenu (...)
as
(
    -- role
    select ...
    from ....
        and parentID is null
    union all
    select ...
    from ....
        inner join  mainMenu on parentID = mainMenu.id
),
userMainMenu (...)
as
(
    -- user
    select ...
    from ....
        and parentID is null
    union all
    select ...
    from ....
        inner join  mainMenu on parentID = mainMenu.id
)
select * from roleMainMenu
union
select * from userMainMenu

Ou vous pouvez combiner au préalable les expressions d'ancre de rôle et d'utilisateur. Je ne sais pas si la requête pour obtenir des éléments enfants est générique pour les éléments de menu de rôle et d'utilisateur, sinon vous pouvez utiliser une expression d'ancrage qui a une union pour les éléments racine de rôle et d'utilisateur.

with mainMenu (...)
as
(
    select root.* from
    (
        -- role roots
        select .. from ... and parentID is null
        union
        -- user roots
        select .. from ... and parentID is null
    ) root
    union all
    select ... from root
    inner join mainMenu on parentID = mainMenu.id
)
select *
from mainMenu