Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Zapytanie rekurencyjne, w którym kotwica i element członkowski mają związki

Nie możesz odwoływać się do mainMenu więcej niż raz. A jest to spowodowane faktem, że w rzeczywistości masz dwa wyrażenia kotwiczące, jedno dla ról, a drugie dla użytkowników. Można to naprawić na dwa sposoby. Możesz podzielić zapytanie na dwa CTE (jedno dla ról, drugie dla użytkowników). Tak:

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

Możesz też wcześniej połączyć role i wyrażenia kotwiczące użytkownika. Nie wiem, czy zapytanie o pozyskiwanie elementów podrzędnych jest ogólne zarówno dla pozycji menu ról, jak i menu użytkownika, w przeciwnym razie można użyć wyrażenia kotwicy, które ma unię dla elementów ról i elementów głównych użytkownika.

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. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Musisz zadeklarować zmienną skalę

  2. Jak sformatować liczbę z przecinkami w T-SQL?

  3. T-sql Resetuj numer wiersza przy zmianie pola

  4. Jak mogę połączyć się z zewnętrzną bazą danych z instrukcji sql lub procedury składowanej?

  5. Dlaczego 30 jest domyślną długością dla VARCHAR podczas korzystania z CAST?