Sie können nicht auf mainMenu
verweisen mehr als einmal. Und das liegt daran, dass Sie tatsächlich zwei Ankerausdrücke haben, einen für Rollen und einen für Benutzer. Es gibt zwei Möglichkeiten, dies zu beheben. Sie könnten Ihre Abfrage in zwei CTEs aufteilen (einen für Rollen, einen für Benutzer). So:
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
Oder Sie könnten die Rollen- und Benutzerankerausdrücke vorher kombinieren. Ich weiß nicht, ob die Abfrage zum Abrufen von untergeordneten Elementen sowohl für Rollen- als auch für Benutzermenüelemente generisch ist. Andernfalls könnten Sie einen Ankerausdruck verwenden, der eine Vereinigung für Rollen- und Benutzerstammelemente enthält.
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