Anda tidak dapat merujuk ke mainMenu
lebih dari sekali. Dan ini disebabkan oleh fakta bahwa Anda sebenarnya memiliki dua ekspresi jangkar, satu untuk peran dan satu untuk pengguna. Ada dua cara untuk memperbaikinya. Anda dapat membagi kueri Anda menjadi dua CTE (satu untuk peran, satu untuk pengguna). Seperti ini:
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
Atau Anda bisa menggabungkan peran dan ekspresi jangkar pengguna sebelumnya. Saya tidak tahu apakah kueri untuk mendapatkan item anak bersifat umum untuk item menu peran dan pengguna, jika tidak, Anda dapat menggunakan ekspresi jangkar yang memiliki gabungan untuk item root peran dan pengguna.
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