Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Consulta recursiva em que âncora e membro têm uniões


Você não pode consultar mainMenu mais de uma vez. E isso é causado pelo fato de que você realmente tem duas expressões âncora, uma para funções e outra para usuários. Existem duas maneiras de corrigir isso. Você pode dividir sua consulta em dois CTEs (um para funções, outro para usuários). Assim:
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

Ou você pode combinar antecipadamente as expressões de função e âncora do usuário. Não sei se a consulta para obter itens filho é genérica para itens de menu de função e usuário, caso contrário, você pode usar uma expressão âncora que tenha uma união para itens de função e raiz do usuário.
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