Du kan inte referera till mainMenu
mer än en gång. Och detta beror på att du faktiskt har två ankaruttryck, ett för roller och ett för användare. Det finns två sätt att fixa detta. Du kan dela upp din fråga i två CTE:er (en för roller, en för användare). Så här:
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
Eller så kan du kombinera roll- och användarankaruttrycken i förväg. Jag vet inte om frågan för att hämta underordnade objekt är generisk för både roll- och användarmenyalternativ, annars kan du använda ett ankaruttryck som har en union för roll- och användarrotobjekt.
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