Bạn không thể tham khảo mainMenu
nhiều hơn một lần. Và điều này là do bạn thực sự có hai biểu thức neo, một cho vai trò và một cho người dùng. Có hai cách để sửa lỗi này. Bạn có thể chia truy vấn của mình thành hai CTE (một cho vai trò, một cho người dùng). Như thế này:
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
Hoặc bạn có thể kết hợp vai trò và biểu thức neo người dùng trước. Tôi không biết liệu truy vấn để lấy các mục con có chung cho cả các mục trình đơn vai trò và người dùng hay không, nếu không, bạn có thể sử dụng biểu thức liên kết có liên kết cho các mục vai trò và người dùng gốc.
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