Не можете да се обърнете към mainMenu
повече от веднъж. И това се дължи на факта, че всъщност имате два израза за котва, един за роли и един за потребители. Има два начина да поправите това. Можете да разделите вашата заявка на два CTE (един за роли, един за потребители). Като това:
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
Или можете предварително да комбинирате изразите за роля и котва на потребителя. Не знам дали заявката за получаване на дъщерни елементи е обща както за роли, така и за потребителски елементи от менюто, в противен случай можете да използвате израз на котва, който има обединение за роли и потребителски коренни елементи.
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