U kunt niet verwijzen naar mainMenu
meerdere keren. En dit wordt veroorzaakt door het feit dat je eigenlijk twee ankerexpressies hebt, één voor rollen en één voor gebruikers. Er zijn twee manieren om dit op te lossen. U kunt uw zoekopdracht opsplitsen in twee CTE's (een voor rollen, een voor gebruikers). Zoals dit:
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
Of u kunt de rol- en gebruikersankerexpressies vooraf combineren. Ik weet niet of de query voor het ophalen van onderliggende items generiek is voor zowel rol- als gebruikersmenu-items, anders zou u een ankerexpressie kunnen gebruiken die een unie heeft voor rol- en gebruikersrootitems.
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