Nie możesz odwoływać się do mainMenu
więcej niż raz. A jest to spowodowane faktem, że w rzeczywistości masz dwa wyrażenia kotwiczące, jedno dla ról, a drugie dla użytkowników. Można to naprawić na dwa sposoby. Możesz podzielić zapytanie na dwa CTE (jedno dla ról, drugie dla użytkowników). Tak:
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
Możesz też wcześniej połączyć role i wyrażenia kotwiczące użytkownika. Nie wiem, czy zapytanie o pozyskiwanie elementów podrzędnych jest ogólne zarówno dla pozycji menu ról, jak i menu użytkownika, w przeciwnym razie można użyć wyrażenia kotwicy, które ma unię dla elementów ról i elementów głównych użytkownika.
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