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 (2 番目のホップ)

したがって、解決策は「 node4 と node9 は node8 から 2 ホップ離れています。

これを解決するのに役立つ SQL クエリはありますか? 常に 2 ホップであるとは限りません。3 ホップとして質問が与えられた場合、次のようにステップを進める必要があります。

node4,8,9 は 2,3,5,7,4,10,14 に接続されています

したがって、解は 2,3,5,7,10,14 です (ノード 8 からすでに 2 ホップ離れているため、4 を除外しました。最短パスと見なします)、ノード 8 から 3 ホップ離れています。

上記の表でこの状況を処理できる SQL クエリはありますか? 何かわからないことがあれば教えてください。

4

1 に答える 1

1

SQLフィドルを試すことができます

スキーマ:

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 に答える