Você não pode consultar
mainMenu
mais de uma vez. E isso é causado pelo fato de que você realmente tem duas expressões âncora, uma para funções e outra para usuários. Existem duas maneiras de corrigir isso. Você pode dividir sua consulta em dois CTEs (um para funções, outro para usuários). Assim: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 você pode combinar antecipadamente as expressões de função e âncora do usuário. Não sei se a consulta para obter itens filho é genérica para itens de menu de função e usuário, caso contrário, você pode usar uma expressão âncora que tenha uma união para itens de função e raiz do usuário.
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