Non puoi fare riferimento a mainMenu
più di una volta. E questo è causato dal fatto che in realtà hai due espressioni di ancoraggio, una per i ruoli e una per gli utenti. Ci sono due modi per risolvere questo problema. Puoi dividere la tua query in due CTE (uno per i ruoli, uno per gli utenti). In questo modo:
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
Oppure potresti combinare in anticipo il ruolo e le espressioni di ancoraggio utente. Non so se la query per ottenere elementi figlio è generica sia per il ruolo che per le voci di menu utente, altrimenti potresti utilizzare un'espressione di ancoraggio che ha un'unione per il ruolo e gli elementi radice dell'utente.
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