Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Найти цепочку связей  [new]
borobos
Member

Откуда:
Сообщений: 53
Помогите решить ситуацию (MSSQL 2008):

1. Есть таблица с данными:
RecordID1RecordID2
12
13
21
23
31
32
45
54


2. Данные выше означают:
значение 1 связано со значением 2
значение 1 связано со значением 3
...
значение 5 связано со значением 4

Получается две группы связаных элементов 1=2=3 и 4=5

Нужно не используя курсор и цикл найти взаимосвязь значений. Тоисть найти группы если есть такие и элементы каждой группы.
По данным с примера результат должен получиться:

GroupIDRecords
11|2|3
24|5
20 авг 14, 21:32    [16470931]     Ответить | Цитировать Сообщить модератору
 Re: Найти цепочку связей  [new]
Exproment
Member

Откуда:
Сообщений: 416
borobos,

Первый вариант - рекурсия через CTE. Второй вариант изменить архитектуру добавив hierarchyid.
20 авг 14, 21:52    [16470986]     Ответить | Цитировать Сообщить модератору
 Re: Найти цепочку связей  [new]
iap
Member

Откуда: Москва
Сообщений: 47145
Exproment
borobos,

Первый вариант - рекурсия через CTE. Второй вариант изменить архитектуру добавив hierarchyid.
Чем поможет рекурсия, если невозможно заранее сказать,
принадлежат ли два элемента одному множеству или нет?
21 авг 14, 08:51    [16471772]     Ответить | Цитировать Сообщить модератору
 Re: Найти цепочку связей  [new]
aleks2
Guest
iap
Exproment
borobos,

Первый вариант - рекурсия через CTE. Второй вариант изменить архитектуру добавив hierarchyid.
Чем поможет рекурсия, если невозможно заранее сказать,
принадлежат ли два элемента одному множеству или нет?


Дык update в цикле while.
Скушно ж.
21 авг 14, 09:03    [16471816]     Ответить | Цитировать Сообщить модератору
 Re: Найти цепочку связей  [new]
WarAnt
Member

Откуда: Питер
Сообщений: 2423
borobos,

create table #t (r1 int, r2 int)
insert #t values (1,2), (1,3), (2,1), (2,3), (3,1), (3,2), (4,5), (5,4)

select row_number() over(order by Records) Groupid, Records
from (select distinct a1.Records
from #t t1
cross apply (select LTRIM(STR(r1)) + '|' from (select t1.r1 union all select r2 from #t where r1 = t1.r1) a order by r1  
for xml path('')) a1(Records)
) a
21 авг 14, 16:21    [16475255]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить