mainMenu
を参照することはできません 一回以上。これは、実際には2つのアンカー式があり、1つはロール用、もう1つはユーザー用であるという事実が原因です。これを修正するには2つの方法があります。クエリを2つのCTE(1つはロール用、もう1つはユーザー用)に分割できます。このように:
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