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