Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Query ricorsiva in cui anchor e member hanno unioni

Non puoi fare riferimento a mainMenu più di una volta. E questo è causato dal fatto che in realtà hai due espressioni di ancoraggio, una per i ruoli e una per gli utenti. Ci sono due modi per risolvere questo problema. Puoi dividere la tua query in due CTE (uno per i ruoli, uno per gli utenti). In questo modo:

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

Oppure potresti combinare in anticipo il ruolo e le espressioni di ancoraggio utente. Non so se la query per ottenere elementi figlio è generica sia per il ruolo che per le voci di menu utente, altrimenti potresti utilizzare un'espressione di ancoraggio che ha un'unione per il ruolo e gli elementi radice dell'utente.

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