आप mainMenu
का संदर्भ नहीं ले सकते एक से ज्यादा बार। और यह इस तथ्य के कारण होता है कि आपके पास वास्तव में दो एंकर भाव हैं, एक भूमिकाओं के लिए और एक उपयोगकर्ताओं के लिए। इसे ठीक करने के दो तरीके हैं। आप अपनी क्वेरी को दो सीटीई (भूमिकाओं के लिए एक, उपयोगकर्ताओं के लिए एक) में विभाजित कर सकते हैं। इस तरह:
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
या आप भूमिका और उपयोगकर्ता एंकर अभिव्यक्तियों को पहले से जोड़ सकते हैं। मुझे नहीं पता कि बाल आइटम प्राप्त करने की क्वेरी भूमिका और उपयोगकर्ता मेनू आइटम दोनों के लिए सामान्य है, अन्यथा आप एक एंकर अभिव्यक्ति का उपयोग कर सकते हैं जिसमें भूमिका और उपयोगकर्ता रूट आइटम के लिए एक संघ है।
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