Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

Рекурсивна заявка, при която котвата и членът имат обединения

Не можете да се обърнете към mainMenu повече от веднъж. И това се дължи на факта, че всъщност имате два израза за котва, един за роли и един за потребители. Има два начина да поправите това. Можете да разделите вашата заявка на два CTE (един за роли, един за потребители). Като това:

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

Или можете предварително да комбинирате изразите за роля и котва на потребителя. Не знам дали заявката за получаване на дъщерни елементи е обща както за роли, така и за потребителски елементи от менюто, в противен случай можете да използвате израз на котва, който има обединение за роли и потребителски коренни елементи.

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. Предаване на дефиниран от потребителя тип таблица между база данни на SQL Server

  2. Защо да изберете клауза Top може да доведе до дългосрочни разходи

  3. Как да наблюдавате промените в таблицата на SQL Server с помощта на C#?

  4. Как да върнете стойността на ASCII кода за даден знак в SQL Server

  5. SQL Server 2008 CTE рекурсия