Как перебрать иерархические данные в хранимом процессе Sql Server 2005? - PullRequest
1 голос
/ 14 июня 2010

У меня есть таблица SqlServer2005 «Группа», похожая на следующую:

Id (PK, int)
Name (varchar(50))
ParentId (int)

где ParentId ссылается на другой идентификатор в таблице группы. Это используется для моделирования иерархических групп, таких как:

Group 1 (id = 1, parentid = null)
    +--Group 2 (id = 2, parentid = 1)
    +--Group 3 (id = 3, parentid = 1)
           +--Group 4 (id = 4, parentid = 3)
Group 5 (id = 5, parentid = null)
    +--Group 6 (id = 6, parentid = 5)

Вы получаете изображение

У меня есть еще одна таблица, давайте для простоты назовем ее «Данные», которая выглядит примерно так:

Id (PK, int)
Key (varchar)
Value (varchar)
GroupId (FK, int)

Теперь я пытаюсь написать сохраненный процесс, который может дать мне «Данные» для данной группы. Например, если я запрашиваю группу 1, она возвращает мне пары ключ-значение из данных, где groupId = 1. Если я запрашиваю группу 2, она возвращает KVP для groupId = 1, а затем объединяет их с теми, у которых groupId = 2 (и дублированные ключи заменяются).

В идеале, sproc также может корректно завершиться ошибкой, если есть цикл (т. Е. Если родитель группы 1 - группа 2, а родитель группы 2 - группа 1)

Кто-нибудь имел опыт написания такого вздора или знает, как это можно сделать?

Спасибо, ребята, очень признателен,

Alex

1 Ответ

3 голосов
/ 14 июня 2010

Это может быть выполнено с использованием рекурсивных запросов и CTE

;WITH KeyValue AS
(
SELECT G.Id, G.Name, D.Key, D.Value, 0 AS level
FROM Group G
LEFT JOIN Data D ON G.Id = D.GroupID
WHERE G.Id = @your_top_level_root

UNION ALL

SELECT G.Id, G.Name, D.Key, D.Value, K.level + 1
FROM KeyValue K
JOIN Group G ON G.ParentId = K.Id
LEFT JOIN Data D ON G.Id = D.GroupID
)
SELECT * FROM KeyValue
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...