2012-10-03 73 views
0

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

 
Nodes Connected to the nodes 
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个跳以外的信息(比如假设)

 
node 8 - node 7(First Hop) 
node 7 - node 4,8,9(Second Hop) 

因此,该解决方案是“节点4和节点9距离节点8跳了2跳

是否有一个SQL查询有助于解决这个问题?它可能不仅仅是2跳,给出一个3跳的问题,我们需要进一步步骤如下:

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

所以,解决方案是2,3,5,7,10,14(我们排除了4,因为它是距离节点8已经2跳,我们将考虑最短路径)与节点8相距3跳。

是否有SQL查询可以处理上述表的这种情况? 如果我不清楚什么,请让我知道吗?

+1

你能正常化这个吗? – Kermit

+1

你真的想在SQL中做到这一点吗? – Luftwaffe

+0

@Anamika:帮助解决方案,还是在这方面仍然存在一个悬而未决的问题? –

回答

1

您可以尝试on 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也被包括d。 (7是1跳,4是2跳8)。