sql >> Databáze >  >> RDS >> Sqlserver

Rekurzivní dotaz, kde kotva a člen mají spojení

Nemůžete odkazovat na mainMenu více než jednou. A to je způsobeno tím, že ve skutečnosti máte dva kotvící výrazy, jeden pro role a jeden pro uživatele. Existují dva způsoby, jak to opravit. Dotaz můžete rozdělit do dvou CTE (jeden pro role, jeden pro uživatele). Takhle:

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

Nebo můžete předem zkombinovat výrazy role a uživatelského ukotvení. Nevím, jestli je dotaz na získání podřízených položek obecný pro položky nabídky role i uživatele, jinak byste mohli použít výraz kotvy, který má sjednocení pro položky role a kořenové položky uživatele.

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. Migrace z AnswerHub na WordPress:Příběh 10 technologií

  2. SQL Cheat Sheet:Co je SQL, SQL příkazy a SQL Injection

  3. Jak mohu získat rovnoměrnou distribuci pomocí WHERE id IN(1,2,3,4)

  4. Vyberte dotaz se třemi, kde jsou podmínky pomalé, ale stejný dotaz s libovolnou kombinací dvou ze tří, kde jsou podmínky rychlé