0

我有一个有 14 个节点的网络。(比如 1 -14)我不知道如何显示网络,但我可以提供包含网络信息的数据库表。网络信息如下:

连接到节点的节点
1 2,5
2 1,3,4,5
3 2,4
4 2,3,5
5 1,2,4
6 5,11,12
7 4,8,9
8 7
9 4,7,10,14
10 9,11
11 6,10
12 6,13
13 12,14
14 9,13

现在,在这种情况下,我需要距离节点 8 2 跳的所有节点的信息(假设)

节点 8 - 节点 7(第一跳)
节点 7 - 节点 4,8,9(第二跳)

因此,解决方案是“ node4 和 node9 距离 node8 2 跳。

是否有有助于解决此问题的 SQL 查询?它可能不会一直只有 2 跳。给定一个问题为 3 跳,我们需要进一步我们的步骤:

node4,8,9 连接到 2,3,5,7,4,10,14

因此,解决方案是 2、3、5、7、10、14(我们排除了 4,因为它已经距离 node8 2 跳,我们将考虑最短路径)距离 node8 3 跳。

是否有 SQL 查询可以处理上表的这种情况?如果我不清楚任何事情,请告诉我?

4

1 回答 1

1

你可以试试sql fiddle

架构:

create table tNodes (
  id int
  ,connectedto int
)

insert tNodes values(1,2)
insert tNodes values(1,5)
insert tNodes values(2,1)
insert tNodes values(2,3)
insert tNodes values(2,4)
insert tNodes values(2,5)
insert tNodes values(3,2)
insert tNodes values(3,4)
insert tNodes values(4,2)
insert tNodes values(4,3)
insert tNodes values(4,5)
insert tNodes values(5,1)
insert tNodes values(5,2)
insert tNodes values(5,4)
insert tNodes values(6,5)
insert tNodes values(6,11)
insert tNodes values(6,12)
insert tNodes values(7,4)
insert tNodes values(7,8)
insert tNodes values(7,9)
insert tNodes values(8,7)
insert tNodes values(9,4)
insert tNodes values(9,7)
insert tNodes values(9,10)
insert tNodes values(9,14)
insert tNodes values(10,9)
insert tNodes values(10,11)
insert tNodes values(11,6)
insert tNodes values(11,10)
insert tNodes values(12,6)
insert tNodes values(12,13)
insert tNodes values(13,12)
insert tNodes values(13,14)
insert tNodes values(14,9)
insert tNodes values(14,13)

询问:

declare @id int = 8
declare @iHops int = 3
declare @iCnt int = 0

create table #tf (id int)
create table #tf0 (id int)
create table #tt (id int)

insert #tf values (@id)

while @iCnt<@iHops
begin

insert
    #tt (id)
  select distinct
    connectedto
  from
    tNodes
  where
    id in (select id from #tf)
    and
    connectedto not in (select id from #tf0)

  delete #tf
  insert #tf (id) select id from #tt
  insert #tf0 (id) select id from #tt
  delete #tt

  set @iCnt = @iCnt + 1
end

/*
select * from #tt
union all
select -1
union all
*/
select * from #tf
/*
union all
select -1
union all
select * from #tf0
*/
drop table #tf0
drop table #tf
drop table #tt

结果:

ID
2
3
5
10
14

因为 4 和 7 也被包括在内。(7 距离 1 跳,4 距离 8 2 跳)。

于 2012-10-04T07:19:53.210 回答