sql >> Databasteknik >  >> RDS >> Sqlserver

Rekursiv fråga där ankare och medlem har fackföreningar

Du kan inte referera till mainMenu mer än en gång. Och detta beror på att du faktiskt har två ankaruttryck, ett för roller och ett för användare. Det finns två sätt att fixa detta. Du kan dela upp din fråga i två CTE:er (en för roller, en för användare). Så här:

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

Eller så kan du kombinera roll- och användarankaruttrycken i förväg. Jag vet inte om frågan för att hämta underordnade objekt är generisk för både roll- och användarmenyalternativ, annars kan du använda ett ankaruttryck som har en union för roll- och användarrotobjekt.

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


  1. Laravel - PDO Prepared Statement - Kan inte köra frågor medan andra obuffrade frågor är aktiva

  2. MySQL-index – vilka är de bästa metoderna?

  3. Uppgradera PostgreSQL från 9.6 till 10.0 på Ubuntu 16.10

  4. Så här fixar du:JSON_VALUE Returnerar NULL med långa strängar (SQL-server)