#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.