Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Rekursive Abfrage, bei der Anker und Member Vereinigungen haben

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