Есть граф, характеризующий связи между организациями на основании взаимоотношений владения.
При этом возможно:
- как перекрестное владение (А владеет Б и Б владеет А),
- так и кольцевое владение (А владеет Б, Б владеет С, С владеет А).
Требуется: для конкретной организации А узнать всех её прямых и косвенных владельцев.
Рассматривал следующие варианты реализации:
Вариант 1: При помощи конструкции WITH Recursive - не подошел (или я не смог) из-за наличия петель;
Вариант 2: Есть вариантный организации дерева при помощи типа данных HierarchyID,
но для меня это пока сложно (не являюсь специализированным программистом MS SQL), нет времени на детальное изучение (конкретная задача - короткие сроки), не уверен, что мне подойдет (на основании поверхностного изучения сложилось мнение, что данный тип подходит для деревьев).
Вариант 3: Создать рекурсивную функцию в которую передавать список уже пройденных узлов
и проверять их на каждой итерации для исключения возможности зацикливания. Идентификаторы организаций передавать в виде строки, разделенной запятыми (потом разбирать строку - парсить).
Пока остановился на Варианте №3, но может кто-нибудь подскажет более оптимальное решение, если есть ?
Спасибо.
При этом возможно:
- как перекрестное владение (А владеет Б и Б владеет А),
- так и кольцевое владение (А владеет Б, Б владеет С, С владеет А).
Требуется: для конкретной организации А узнать всех её прямых и косвенных владельцев.
Рассматривал следующие варианты реализации:
Вариант 1: При помощи конструкции WITH Recursive - не подошел (или я не смог) из-за наличия петель;
Вариант 2: Есть вариантный организации дерева при помощи типа данных HierarchyID,
но для меня это пока сложно (не являюсь специализированным программистом MS SQL), нет времени на детальное изучение (конкретная задача - короткие сроки), не уверен, что мне подойдет (на основании поверхностного изучения сложилось мнение, что данный тип подходит для деревьев).
Вариант 3: Создать рекурсивную функцию в которую передавать список уже пройденных узлов
и проверять их на каждой итерации для исключения возможности зацикливания. Идентификаторы организаций передавать в виде строки, разделенной запятыми (потом разбирать строку - парсить).
Пока остановился на Варианте №3, но может кто-нибудь подскажет более оптимальное решение, если есть ?
Спасибо.