Рекурсивный запрос для выбора родительских и дочерних случаев в SQL - PullRequest
0 голосов
/ 04 октября 2018

Я пытаюсь реализовать рекурсию по запросу, используя Common Table Expression.Однако я не очень знаком с этим.Сценарий включает в себя родительские и дочерние случаи, когда Родитель при входе в систему может видеть свои собственные, а также все дочерние случаи и так далее, и так далее.Но я не могу сделать это с помощью выражения cte.

У меня есть таблица пользователей и таблица отношений, которая содержит как основного, так и дополнительного пользователя.Основной пользователь - родительский, а дополнительный - дочерний.

Ниже приведен мой запрос.

select *
from dbo.[Case] c
left join dbo.[User] u on c.AssignedTo = u.UserId
left join dbo.[User] uu on c.AssignedTo = uu.UserId
where uu.UserId in (select SecondaryUser from  dbo.[Relations]
                    where PrimaryUser = 'f422233f-9c70-4052-81a5-e2525707df0b') 
    or u.UserId = 'f422233f-9c70-4052-81a5-e2525707df0b'

Но приведенный выше запрос возвращает только один родительский и один дочерний регистр.И я хочу, чтобы несколько родителей и их дочерний регистр использовали общее табличное выражение.

При условии, что некоторые пользователи выглядят следующим образом

    Id   Name   Email 
    001  Salar  salar@gmail.com
    002  Ather  ather@gmail.com
    003  John   john@gmail.com

И в таблице RelationShip

Id   PrimaryUser SecondaryUser
101    001       002
001    002       003

И их назначенные случаи

Id     CaseTitle    CaseDescription  AssingedTo
101    Case 1       First case    001
102    Case 2       Second case   002
103    Case 3       Third case    003

Поэтому, когда я вошел в систему с идентификатором 001, я должен увидеть все три случая, а когда я вошел с помощью 002, я должен увидеть последние два случая.

Ответы [ 2 ]

0 голосов
/ 04 октября 2018

Этот запрос вернет все идентификаторы пользователя относительно первого идентификатора.Вы можете объединить результат с делами:

declare @Users as table
    (UserId  int)
;

declare @Relations as table
    (PrimaryUser  int, SecondaryUser int)
;    

INSERT INTO @Relations
    (PrimaryUser, SecondaryUser)
VALUES
    (1,2),
    (1,3),
    (2,4),
    (2,7),
    (2,8),
    (5,6),
    (6,19)

INSERT INTO @Users
    (UserId)
VALUES
    (1),
    (2),
    (3),
    (4),
    (5),
    (7),
    (5),
    (6),
    (19),
    (20)

;WITH cte1 AS (
  SELECT UserId AS [User]
  FROM @Users 
  WHERE UserId = 5
  GROUP BY UserId
UNION ALL  
  SELECT SecondaryUser  AS [User]
  FROM cte1
  JOIN @Relations t 
    ON t.PrimaryUser = cte1.[User]   
)
SELECT [User] FROM cte1
0 голосов
/ 04 октября 2018

Вот очень простой пример иерархического CTE:

with t(level,path,boss,name) as 
(
        -- this is the starting point (can be one or more records)
        select 0,name,boss,name from @empl where boss is null

        union all

        -- here you construct the tree (via the join conditions)
        select
            level + 1,
            path + ' > ' + e.name,
            e.boss, e.name 
        from @empl e
            inner join t on e.boss = t.name                
) 
-- here you collect the results from the cte
select * 
from t 
order by path;

Cf.https://gist.github.com/pedroreys/8336d6f4dcb63ba619c0

...