У меня есть следующая таблица с образцами данных:
Таблица: tbl_nodes
create table tbl_nodes
(
nod1 varchar(50),
nod2 varchar(50)
);
Образцы данных:
insert into tbl_nodes values('Node1','Node2');
insert into tbl_nodes values('Node2','Node4');
insert into tbl_nodes values('Node2','Node3');
insert into tbl_nodes values('Node2','Node5');
insert into tbl_nodes values('Node3','Node5');
insert into tbl_nodes values('Node3','Node6');
insert into tbl_nodes values('Node6','Node7');
insert into tbl_nodes values('Node10','Node11');
insert into tbl_nodes values('Node6','Node8');
insert into tbl_nodes values('Node18','Node19');
insert into tbl_nodes values('Node9','Node10');
insert into tbl_nodes values('Node12','Node13');
insert into tbl_nodes values('Node15','Node16');
ПРИМЕЧАНИЕ : У меня больше, чем 5000 записей в таблице выше.
Ожидаемый результат :
------------------------------------
Connectivity
------------------------------------
Node1->Node2->Node3->Node5
Node1->Node2->Node3->Node6->Node7
Node1->Node2->Node3->Node6->Node8
Node1->Node2->Node4
Node1->Node2->Node5
Node9->Node10->Node11
Объяснение Об ожидаемом результате : Я хочу найти соединение между узлами, имеющими более 2 узловНапример, Node1
имеет связь с Node2
и Node2
с 3,4,5 и т. д., как показано в ожидаемом наборе результатов. И хотим отображать каждое соединение до тех пор, пока не будет найден конечный узел, например конечными узлами являются Node4
, Node5
, Node7
, Node8
и Node11
.
Я попробовал следующий запрос:
Моя попытка :
;WITH CTE AS
(
SELECT nod1,nod2,
CAST(nod1 AS VARCHAR(MAX))+'->' AS conn,
1 as lvl
from tbl_nodes T1
where EXISTS (select 1 from tbl_nodes T2 where T1.nod2 =T2.nod1) OR
EXISTS (select 1 from tbl_nodes T3 WHERE T1.nod1 =T3.nod2)
UNION ALL
SELECT C1.nod1,C1.nod2,
C.conn+CAST(C1.nod1 AS VARCHAR(MAX))+'->',
c.lvl+1
FROM CTE C INNER JOIN tbl_nodes C1 ON C.nod2 = C1.nod1
WHERE CHARINDEX(','+C.nod2+',',C.conn)=0
),cte2 as
(
select * , ROW_NUMBER() over (partition by nod1,nod2 order by lvl)as rn From CTE
),cte3 as
(
select nod1,nod2 ,MAX(LEN(conn)) conn,MAX(rn) rn
from cte2
group by nod1,nod2
)
SELECT DISTINCT c2.conn+c3.nod2 AS Connectivity
from cte3 c3
inner join cte2 c2 on c3.rn = c2.rn and c3.nod1 = c2.nod1
where c3.nod2 not in (select nod1 from cte2)
Вышеупомянутый запрос работает нормально, но не может получить результат для записей более чем5000, запрос продолжает выполняться безрезультатно.
Редактировать : я не могу прикрепить текущие данные, поскольку они содержат конфиденциальную информацию, но объясню! У меня есть таблица со столбцами Name1
и Name2
, которые я назвал Nod1
и Nod2
. Я хочу выяснить отношения между именами, как мы находим связь между узлами здесь в данном примере. Один человек (Name1
), возможно, совершил какую-то транзакцию со вторым лицом (Name2
), а Name2
, возможно, должен будет сделать любое другое лицо. Поэтому мне нужно выяснить связь сделок между людьми. Это так же, как приведенный пример. Я попытался с помощью данного запроса разделить данные: для 100 записей это происходит в течение нескольких секунд, для 500 записей это занимает 1 минуту, а для 5000 записей он продолжает выполняться из-за большего количества перестановок и комбинаций. Проблема в том, что с последним набором данных (5000) мы должны выяснить ссылки.