Найти значения столбцов подключения - PullRequest
0 голосов
/ 10 октября 2019

У меня есть следующая таблица с образцами данных:

Таблица: tbl_nodes

create table tbl_nodes
(
    nod1 varchar(50),
    nod2 varchar(50),
    nod_lenght float
);

Образцы данных:

insert into tbl_nodes values('A','B',1600); 
insert into tbl_nodes values('G','H',45000);
insert into tbl_nodes values('B','C',2300);
insert into tbl_nodes values('C','D',2640);
insert into tbl_nodes values('B','D',2840);
insert into tbl_nodes values('C','E',2940);
insert into tbl_nodes values('D','F',2340);
insert into tbl_nodes values('M','N',9000);
insert into tbl_nodes values('E','A',100000);

Ожидаемый результат :

Connectivity        Total_Length
----------------------------------
A-B-C-D-F           8880
A-B-C-E-A           106840
A-B-D-F             6780

Примечание : Я пытаюсь выяснить связность узлов и сумму длины между узлами.

Я пробовал следующий запрос длято же самое:

Моя попытка :

;WITH CTE AS
(
    SELECT nod1,nod2 ,sum(nod_lenght) as Total_length
    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)
    GROUP BY nod1,nod2 
)
SELECT STUFF((select '-'+ case when c1.nod2 = c2.nod1 then c1.nod1 else c2.nod2 end
              from CTE c1 
              where c1.nod2 =c2.nod1 or c1.nod1 =c2.nod2
              for xml path('')),1,1,''),Total_length
FROM CTE c2

Невозможно получить ожидаемый результат.

1 Ответ

3 голосов
/ 10 октября 2019

Я почти уверен, что вам нужен рекурсивный CTE. Тем не менее, ваши результаты выборки не имеют смысла.

Следующее в основном делает то, что вы хотите:

with cte AS (
      select nod1, nod2, nod_length as Total_length,
             convert(varchar(max), concat('-', nod1, '-', nod2, '-')) as nodes, 1 as lev
      from tbl_nodes n
      where nod1 = 'A'
      union all
      select cte.nod1, n.nod2, cte.Total_length + n.nod_length,
             convert(varchar(max), concat(cte.nodes, n.nod2, '-')) as nodes, lev + 1
      from cte join
           tbl_nodes n
           on cte.nod2 = n.nod1
      where nodes not like concat('%-', n.nod2, '-%') 
     )
select nodes, total_length
from cte
where not exists (select 1
                  from cte cte2
                  where cte2.nodes like concat(cte.nodes, '_%')
                 );

Здесь - это db <> скрипка.

...