MS SQL Server: логика для определения групп всех зависимых записей из таблицы, имеющей элементы источника и назначения

#sql #sql-server-2008 #recursion

#sql #sql-server-2008 #рекурсия

Вопрос:

Я использую MS SQL Server DB. У меня есть конкретная потребность в определении групп взаимозависимых элементов. Визуализируйте ниже сценарий, в котором у нас есть два элемента в каждой строке, один из которых является элементом источника, а другой — элементом назначения. Любой элемент может быть источником любого элемента, а также для назначения. У нас есть два столбца в таблице: «Источник» и «Назначение». Давайте рассмотрим 10 значений в таблице, как показано ниже:

 Source | Destination
A | B
B | C
C | D
E | A
D | E
X | Y
Y | Z
Z | X
P | Q
R | S
  

Мое требование — получить отдельные группы элементов с источником и назначением. Это означает, что мой запрос должен возвращать результат ниже с 4 строками (сгруппированные элементы в форме, разделенной запятыми):

 RowNum| Result
1| A,B,C,D,E
2| X,Y,Z
3| P,Q
4| R,S
  

Здесь уровень иерархии может быть до n числа. В моем примере я сохранил первую группу из 5 элементов (от A до B, от B до C, от C до D, от D до E и от E до A — означает, что в этой группе участвуют 5 разных элементов). Но в данных может быть и больше элементов, в одной группе. Также возможны циклические записи (от X до, от Y до Z и от Z до X)

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

Может ли кто-нибудь предложить лучший способ или алгоритм для достижения этой цели?

Любая помощь по этому вопросу будет оценена.

Комментарии:

1. Если вы хотите решить эту проблему в SQL, вам нужно быть более конкретным в отношении используемой вами базы данных, т.Е. postgres, mysql, oracle и т. Д…

2. Пометьте свой вопрос базой данных, которую вы используете.

3. Мы используем базу данных Microsoft SQL.