2012-10-03 55 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)。