Рекурсия T-SQL; Несколько рекурсий?

Я пытаюсь концептуализировать решение проблемы с рекурсивной проблемой, и я не могу полностью обдумать ее. У меня три таблицы. Мы будем называть их DocGroup , GroupGroup и GroupUser . В таблице DocGroup существует иерархическая структура одной записи, которая указывает другую запись как ее родительскую и так далее, пока запись не станет ее собственным родителем.

 Doc Group 1 1 2 2 3 2 4 3 5 2 6 4 

GroupGroup содержит Групповое вложение:

 Group MemberGroup 4 2 4 1 

GroupUser отображает группу для нескольких пользователей:

 Group User Key 1 1 ABC 1 3 BCD 1 4 CDE 2 1 DEF 2 2 EFG 2 3 FGH 3 3 GHI 4 2 HIJ 4 3 IJK 4 4 JKL 

Поэтому я хотел бы указать пользователя и документ и получить список всех ключей для этой комбинации. Например, если я выбираю пользователя 2 и документ 2, мне нужно вернуть «EFG», но если я выберу документ 6 и пользователь 3, мне нужно вернуть «IJK», «GHI», «FGH» и «BCD», потому что группа 2 и 1 находятся в группе 4, а группа 4 = документ 4, которая имеет группу из 3. Во всех случаях мне нужно только получить запись для указанного пользователя.

Я бы предположил, что мне нужно несколько рекурсий, чтобы это сделать, но я не могу мысленно определить, как это можно сделать в SQL, и я не хочу деградировать на циклы и курсоры для этого.

Хорошо, вот ответ:

 DECLARE @Key varchar(max) ;WITH DocBase AS ( SELECT Doc, Group FROM DocGroup WHERE Doc = @Doc UNION ALL SELECT DocGroup.Doc, DocGroup.Group FROM DocGroup INNER JOIN DocBase ON DocGroup.Doc = DocBase.Group WHERE DocBase.Doc <> DocBase.Group --to prevent infinite recursion ), GroupNesting AS ( SELECT Doc FROM DocBase UNION ALL SELECT MemberGroup FROM GroupGroup.Group = GroupNesting.Doc ), GroupList AS ( SELECT DISTINCT Doc FROM GroupNesting ), KeyList AS ( SELECT Key FROM GroupList INNER JOIN GroupUser ON GroupList.Doc = GroupUser.Group WHERE User = @User ) SELECT @Key = COALESE(@Key, '') + Key FROM Key SELECT @Key 

Я мог бы использовать любые предложения из http://www.simple-talk.com/sql/t-sql-programming/concatenating-row-values-in-transact-sql/ для окончательной конкатенации, но я выбрал этот метод, потому что он самый простой, и я все равно ставил это в процедуру.

Я должен опубликовать это, потому что я бушующий эгоманец:

Дзен рекурсии

Но серьезно, вот как мы это делали в тот же день. В эти дни вы должны использовать Common Table Expression .

НТН.

  • Бесконечный цикл в CTE при анализе таблицы саморегуляции
  • Нужно написать рекурсивную функцию даты в sql?
  • Найти иерархию для каждого узла
  • Рекурсивный запрос INSERT для сгруппированной последовательности
  • использовать рекурсивные общие табличные выражения для поиска последовательных no.s из двух таблиц
  • Взрывная спецификация с помощью рекурсивного CTE
  • Присоедините таблицу к себе
  • Можно ли заставить SQL Server использовать план, который я хочу оптимизировать рекурсивный запрос cte
  • Иерархические данные SQL (Рекурсивный CTE против HierarchyID против таблицы закрытия)
  • Как получить связанный список, например (родительский - дочерний), сопоставленные столбцы в одном запросе?
  • Рекурсивный запрос SQL
  • Interesting Posts

    Разница между выбором из целого раздела или из таблицы с небольшим набором данных?

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

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

    Избегайте показывать повторяющиеся Poptart Flavors, когда они теплые

    Каков наилучший метод преобразования данных в sql

    Преобразование инструкции SQL CASE WHEN в C #

    Как перевернуть / перенести верхние 5 строк в столбцы

    Как использовать INCLUDE в Linq только для выбранных столбцов?

    Отобразить обозначение, основанное на их достижениях в SQL Server

    Необходимо заполнить столбец на основе другого столбца в другой таблице

    SQL-запрос – отфильтровать поле, содержащее только пробелы

    Общая группа из двух выбранных, sql-серверов

    В чем разница между «;» и «GO» в T-SQL?

    Случайное назначение места работы и каждое место не должно превышать число назначенных сотрудников

    структурируйте эти данные, чтобы их можно было прочитать рекурсивным cte? (SQL Server)

    Давайте будем гением компьютера.