一起草最新网址_日韩一区二区麻豆国产_91视频婷婷_日本一区二区视频在线_日韩激情一区二区三区_国产另类第一区_成人免费在线播放视频_亚洲永久精品ww.7491进入_久久这里有精品视频_久久精品一级片_日韩av在线网页_波多野结衣不卡视频

在SQL Server中實現最短路徑搜索的解決方法_Mssql數據庫教程

編輯Tag賺U幣

推薦:Sql學習第一天——SQL 練習題(建表/sql語句)
來自Madrid且訂單數少于3的消費者,針對這個要求作出以下:建表做題分析以及sql語句的寫法,感興趣的朋友可以參考下哈,希望可以幫助到你

開始

這是去年的問題了,今天在整理郵件的時候才發現這個問題,感覺頂有意思的,特記錄下來。

在表RelationGraph中,有三個字段(ID,Node,RelatedNode),其中Node和RelatedNode兩個字段描述兩個節點的連接關系;現在要求,找出從節點"p"至節點"j",最短路徑(即經過的節點最少)。

圖1.

解析:

了能夠更好的描述表RelationGraph中字段Node和 RelatedNode的關系,我在這里特意使用一個圖形來描述,
如圖2.

圖2.

在圖2,可清晰的看出各個節點直接如何相連,也可以清楚的看出節點"p"至節點"j"的的幾種可能路徑。

從上面可以看出第2種可能路徑,經過的節點最少。

為了解決開始的問題,我參考了兩種方法,

第1方法是,

參考單源最短路徑算法:Dijkstra(迪杰斯特拉)算法,主要特點是以起始點為中心向外層層擴展,直到擴展到終點為止。


圖3.

第2方法是,

針對第1種方法的改進,就是采用多源點方法,這里就是以節點"p"和節點"j"為中心向外層擴展,直到兩圓外切點,如圖4. :

圖4.

實現:

在接下來,我就描述在SQL Server中,如何實現。當然我這里采用的前面說的第2種方法,以"P"和"J"為始點像中心外層層擴展。

這里提供有表RelactionGraph的create& Insert數據的腳本:

復制代碼 代碼如下:www.zhaotila.cn

use TestDB

go

if object_id('RelactionGraph') Is not null drop table RelactionGraph

create table RelactionGraph(ID int identity,Item nvarchar(50),RelactionItem nvarchar(20),constraint PK_RelactionGraph primary key(ID))

go

create nonclustered index IX_RelactionGraph_Item on RelactionGraph(Item) include(RelactionItem)

create nonclustered index IX_RelactionGraph_RelactionItem on RelactionGraph(RelactionItem) include(Item)

go

insert into RelactionGraph (Item, RelactionItem ) values

('a','b'),('a','c'),('a','d'),('a','e'),

('b','f'),('b','g'),('b','h'),

('c','i'),('c','j'),

('f','k'),('f','l'),

('k','o'),('k','p'),

('o','i'),('o','l')

go


編寫一個存儲過程up_GetPath
復制代碼 代碼如下:www.zhaotila.cn

use TestDB
go
--Procedure:
if object_id('up_GetPath') Is not null
Drop proc up_GetPath
go
create proc up_GetPath
(
@Node nvarchar(50),
@RelatedNode nvarchar(50)
)
As
set nocount on

declare
@level smallint =1, --當前搜索的深度
@MaxLevel smallint=100, --最大可搜索深度
@Node_WhileFlag bit=1, --以@Node作為中心進行搜索時候,作為能否循環搜索的標記
@RelatedNode_WhileFlag bit=1 --以@RelatedNode作為中心進行搜索時候,作為能否循環搜索的標記

--如果直接找到兩個Node存在直接關系就直接返回
if Exists(select 1 from RelationGraph where (Node=@Node And RelatedNode=@RelatedNode) or (Node=@RelatedNode And RelatedNode=@Node) ) or @Node=@RelatedNode
begin
select convert(nvarchar(2000),@Node + ' --> '+ @RelatedNode) As RelationGraphPath,convert(smallint,0) As StopCount
return
end

--

if object_id('tempdb..#1') Is not null Drop Table #1 --臨時表#1,存儲的是以@Node作為中心向外擴展的各節點數據
if object_id('tempdb..#2') Is not null Drop Table #2 --臨時表#2,存儲的是以@RelatedNode作為中心向外擴展的各節點數據

create table #1(
Node nvarchar(50),--相對源點
RelatedNode nvarchar(50), --相對目標
Level smallint --深度
)

create table #2(Node nvarchar(50),RelatedNode nvarchar(50),Level smallint)

insert into #1 ( Node, RelatedNode, Level )
select Node, RelatedNode, @level from RelationGraph a where a.Node =@Node union --正向:以@Node作為源查詢
select RelatedNode, Node, @level from RelationGraph a where a.RelatedNode = @Node --反向:以@Node作為目標進行查詢
set @Node_WhileFlag=sign(@@rowcount)

insert into #2 ( Node, RelatedNode, Level )
select Node, RelatedNode, @level from RelationGraph a where a.Node =@RelatedNode union --正向:以@RelatedNode作為源查詢
select RelatedNode, Node, @level from RelationGraph a where a.RelatedNode = @RelatedNode --反向:以@RelatedNode作為目標進行查詢
set @RelatedNode_WhileFlag=sign(@@rowcount)

--如果在表RelationGraph中找不到@Node 或 @RelatedNode 數據,就直接跳過后面的While過程
if not exists(select 1 from #1) or not exists(select 1 from #2)
begin
goto While_Out
end


while not exists(select 1 from #1 a inner join #2 b on b.RelatedNode=a.RelatedNode) --判斷是否出現切點
and (@Node_WhileFlag|@RelatedNode_WhileFlag)>0 --判斷是否能搜索
And @level<@MaxLevel --控制深度
begin
if @Node_WhileFlag >0
begin
insert into #1 ( Node, RelatedNode, Level )
--正向
select a.Node,a.RelatedNode,@level+1
From RelationGraph a
where exists(select 1 from #1 where RelatedNode=a.Node And Level=@level) And
Not exists(select 1 from #1 where Node=a.Node)
union
--反向
select a.RelatedNode,a.Node,@level+1
From RelationGraph a
where exists(select 1 from #1 where RelatedNode=a.RelatedNode And Level=@level) And
Not exists(select 1 from #1 where Node=a.RelatedNode)

set @Node_WhileFlag=sign(@@rowcount)

end


if @RelatedNode_WhileFlag >0
begin
insert into #2 ( Node, RelatedNode, Level )
--正向
select a.Node,a.RelatedNode,@level+1
From RelationGraph a
where exists(select 1 from #2 where RelatedNode=a.Node And Level=@level) And
Not exists(select 1 from #2 where Node=a.Node)
union
--反向
select a.RelatedNode,a.Node,@level+1
From RelationGraph a
where exists(select 1 from #2 where RelatedNode=a.RelatedNode And Level=@level) And
Not exists(select 1 from #2 where Node=a.RelatedNode)
set @RelatedNode_WhileFlag=sign(@@rowcount)
end

select @level+=1
end

While_Out:

--下面是構造返回的結果路徑
if object_id('tempdb..#Path1') Is not null Drop Table #Path1
if object_id('tempdb..#Path2') Is not null Drop Table #Path2

;with cte_path1 As
(
select a.Node,a.RelatedNode,Level,convert(nvarchar(2000),a.Node+' -> '+a.RelatedNode) As RelationGraphPath,Convert(smallint,1) As PathLevel From #1 a where exists(select 1 from #2 where RelatedNode=a.RelatedNode)
union all
select b.Node,a.RelatedNode,b.Level,convert(nvarchar(2000),b.Node+' -> '+a.RelationGraphPath) As RelationGraphPath ,Convert(smallint,a.PathLevel+1) As PathLevel
from cte_path1 a
inner join #1 b on b.RelatedNode=a.Node
and b.Level=a.Level-1
)
select * Into #Path1 from cte_path1

;with cte_path2 As
(
select a.Node,a.RelatedNode,Level,convert(nvarchar(2000),a.Node) As RelationGraphPath,Convert(smallint,1) As PathLevel From #2 a where exists(select 1 from #1 where RelatedNode=a.RelatedNode)
union all
select b.Node,a.RelatedNode,b.Level,convert(nvarchar(2000),a.RelationGraphPath+' -> '+b.Node) As RelationGraphPath ,Convert(smallint,a.PathLevel+1)
from cte_path2 a
inner join #2 b on b.RelatedNode=a.Node
and b.Level=a.Level-1
)
select * Into #Path2 from cte_path2

;with cte_result As
(
select a.RelationGraphPath+' -> '+b.RelationGraphPath As RelationGraphPath,a.PathLevel+b.PathLevel -1 As StopCount,rank() over(order by a.PathLevel+b.PathLevel) As Result_row
From #Path1 a
inner join #Path2 b on b.RelatedNode=a.RelatedNode
and b.Level=1
where a.Level=1
)
select distinct RelationGraphPath,StopCount From cte_result where Result_row=1
go

上面的存儲過程,主要分為兩大部分,第1部分是實現如何搜索,第2部分實現如何構造返回結果。其中第1部分的代碼根據前面的方法2,通過@Node 和 @RelatedNode 兩個節點向外層搜索,每次搜索返回的節點都保存至臨時表#1和#2,再判斷臨時表#1和#2有沒有出現切點,如果出現就說明已找到最短的路徑(經過多節點數最少),否則就繼續循環搜索,直到循環至最大的搜索深度(@MaxLevel smallint=100)或找到切點。要是到100層都沒搜索到切點,將放棄搜索。這里使用最大可搜索深度@MaxLevel,目的是控制由于數據量大可能會導致性能差,因為在這里數據量與搜索性能成反比。代碼中還說到一個正向和反向搜索,主要是相對Node 和 RelatedNode來說,它們兩者互為參照對象,進行向外搜索使用。

下面是存儲過程的執行:

復制代碼 代碼如下:www.zhaotila.cn

use TestDB

go

exec dbo.up_GetPath

@Node = 'p',

@RelatedNode = 'j'

go

你可以根據需要來,賦予@Node 和 @RelatedNode不同的值。

拓展:

前面的例子,可擴展至城市的公交路線,提供兩個站點,搜索經過這兩個站點最少站點公交路線;可以擴展至社區的人際關系的搜索,如一個人與另一個人想認識,那么他們直接要經過多少個人才可以。除了人與人直接有直接的朋友、親戚關聯,還可以通過人與物有關聯找到人與人關聯,如幾個作家通過出版一個本,那么就說明這幾個人可以通過某一本書的作者列表中找到他們存在共同出版書籍的關聯,這為搜索兩個人認識路徑提供參考。這問題可能會非常大復雜,但可以這樣的擴展。

小結:

這里只是找兩個節點的所有路徑中,節點數最少的路徑,在實際的應用中,可能會碰到比這里更復雜的情況。在其他的環境或場景可能會帶有長度,時間,多節點,多作用域等一些信息。無論如何,一般都要參考一些原理,算法來實現。

分享:Sql學習第三天——SQL 關于with ties介紹
with ties一般是和Top , order by相結合使用的,會查詢出最后一條數據額外的返回值,接下來將為大家詳細介紹下,感興趣的各位可以參考下哈

來源:模板無憂//所屬分類:Mssql數據庫教程/更新時間:2013-04-24
相關Mssql數據庫教程
欧美中文字幕在线观看视频| 成人免费aaa| www.亚洲免费视频| 超碰在线播放97| 999久久久国产| 亚洲国产精品va在线看黑人动漫 | 亚洲男同1069视频| 青青青伊人色综合久久| 三级影片在线看| 99视频日韩| 日韩一区二区在线看片| 国产无码精品在线播放| 久久国产在线观看| 在线观看成人免费| 2022国产精品| 国产日韩在线看| 在线观看免费中文字幕| 五月婷婷激情视频| www.亚洲精品| 欧美老人xxxx18| 国产精品免费久久久久久| 精品日韩欧美| av在线不卡一区| 中文字幕在线国产精品| 一本一本久久a久久精品综合小说| 欧美性猛交99久久久久99按摩| 久久人妻无码aⅴ毛片a片app| 欧美三级视频网站| 99精品在线播放| 午夜视频在线网站| 亚洲视频在线a| 最近2019中文字幕mv免费看 | 亚洲欧美在线播放| 国产91精品一区二区绿帽| 97netav| 精品久久久久久久一区二区蜜臀| 在线播放视频一区| 亚洲福利精品在线| 国产aⅴ综合色| 久久精品日韩欧美| 欧美午夜片在线看| 亚洲欧美偷拍卡通变态| 欧美精品v国产精品v日韩精品| 精品毛片乱码1区2区3区| 蜜臀av一区二区在线观看| 好男人香蕉影院| 国产三级按摩推拿按摩| 伊人伊成久久人综合网站 | 波多野吉衣在线视频| 涩涩涩999| 亚洲国产精品影视| 伊人久久大香线蕉午夜av| 亚洲最新在线| 欧美一级大片免费看| 国产精品美女www| 国内精品久久久久久影视8| 日韩毛片在线免费看| 777米奇影视第四色| 9.1成人看片| 国产黄色片免费观看| 久久人人爽人人人人片| 黄色a一级视频| 日本中文一区二区三区| 在线播放日韩av| 久久久久亚洲AV成人无在| 91免费视频大全| 国产精品狼人色视频一区| 国产午夜福利100集发布| 996这里只有精品| 男女超爽视频免费播放| 欧美日韩在线观看免费| 欧美福利视频一区二区| 亚洲黄色免费在线观看| 日韩女同一区二区三区 | 日韩午夜电影av| 久久91精品国产| 亚洲欧洲成视频免费观看| 精品性高朝久久久久久久| 国产亚洲欧美一区二区三区| 亚洲第一区av| 欧美丰满少妇xxxxx做受| 四川一级毛毛片| 亚洲h精品动漫在线观看| 性欧美激情精品| 香蕉久久夜色| 91看片在线播放| 美女脱光内衣内裤视频久久网站 | 色狠狠色噜噜噜综合网| 欧美亚洲激情视频| 日本a√在线观看| 手机免费看av片| 国产一区二区三区四| 欧美日韩在线直播| 欧美一区二区三区成人| 日韩欧美激情一区二区| 无码人妻精品一区二区三区9厂 | 69av视频在线播放| 国产jk精品白丝av在线观看| 亚洲3atv精品一区二区三区| 欧美黑人xxx| 性欧美videosex高清少妇| 三级网站在线免费观看| 久久久久久免费网| 91电影在线观看| 日韩欧美国产综合| 国产98在线|日韩| 国产av无码专区亚洲a∨毛片| 国内精品久久久久久久久久| 欧美激情综合在线| 欧美性做爰毛片| 久久综合九色综合网站| 国产欧美精品一二三| 97精品超碰一区二区三区| 成人欧美一区二区三区视频| 中文字幕在线一区二区三区| 911福利视频| 亚洲综合激情网| 性色av浪潮av| 中文字幕亚洲精品在线观看 | 日本久久高清视频| 国产无套粉嫩白浆内谢| www成人在线| 2014亚洲片线观看视频免费| 成人妇女免费播放久久久| 99久久久久久久| 国产亚洲女人久久久久毛片| 欧美孕妇性xx| 精品人妻伦九区久久aaa片| 国产亚洲欧美日韩日本| 欧美日韩中字一区| v8888av| 一区在线观看视频| 91激情视频在线观看| 国产精品99久久99久久久二8| 国产精品羞羞答答xxdd| 免费看污污网站| 中文字幕亚洲不卡| 色一情一乱一伦一区二区三区丨| 亚洲三区在线| 亚洲国产www| 国产日本欧美在线观看| 涩涩网站在线看| 中文字幕在线网址| 久久视频在线免费观看| 色一情一乱一区二区三区| 一区二区三区精品在线| 91免费视频黄| 亚洲人成网站在线| 精品国免费一区二区三区| 欧美日韩精品区别| 欧美一区二区三区思思人| 精品国产av鲁一鲁一区 | 欧美大黑帍在线播放| 欧美视频一区二区三区在线观看| 少妇视频在线播放| 欧美精选一区二区| 亚洲va韩国va欧美va精四季| 国产麻豆成人精品| 成人亚洲激情网| www..com日韩| 免费三级在线观看| 中国色在线观看另类| 欧产日产国产精品98| 亚洲老板91色精品久久| 亚洲精品国产精品久久| 精品一二线国产| 欧美精品久久96人妻无码| 久久aaaa片一区二区| 欧美性xxxx18| 日本中文字幕在线不卡| 久久人人爽国产| 一区二区三区高清在线| 精品人妻一区二区三区三区四区| 韩国一区二区av| 欧美精品日韩精品| 中文字幕第六页| 欧美一区二区三区四区五区| 91玉足脚交白嫩脚丫| 91精品国产欧美一区二区18| 国产精品 欧美 日韩| 久久成人人人人精品欧| 无码人妻少妇伦在线电影| 丰满熟妇乱又伦| 日韩电影大片中文字幕| 国产男女激情视频| 精品久久久三级丝袜| 中文字幕黄色av| 成人免费视频观看视频| 久久综合成人精品亚洲另类欧美| 国产超级av在线| 91精品美女在线| 欧美成人高清电影在线| 国产农村妇女毛片精品久久麻豆| 国产三级三级在线观看| 成人国产一区二区三区精品| 黑人粗进入欧美aaaaa| 欧美猛男男办公室激情| 欧美极品aaaaabbbbb| 成人午夜在线影院| 一区二区三区丝袜| 久久国产露脸精品国产| 伊人性伊人情综合网| 综合国产精品久久久| 成人avav在线| www.黄色网址.com| 自拍偷拍亚洲欧美日韩| av黄色在线播放| 熟妇人妻无乱码中文字幕真矢织江| 欧美三级日韩在线| 国产三级在线观看视频| 国产精品免费成人| 国产精品无码乱伦| 91麻豆国产精品| 一区二区三区日韩在线| 91免费在线看| 国产成人自拍网站| 国产一区二区三区黄| 日本高清不卡视频| 在线免费看91| 日本手机在线视频| 欧美一级日韩一级| 久久久精品成人| 亚洲美女久久久| 久久精品视频2| 成人欧美一区二区三区在线 | 欧美中文字幕视频| 国产精品一区久久久久| 性感美女一区二区三区| 久久综合中文色婷婷| 欧美人与性动交a欧美精品| 亚洲视频专区在线| 日韩理论片久久| 欧美伊人久久久久久午夜久久久久| 中文字幕欧美人妻精品一区蜜臀| 黄色成人在线免费观看| 日韩三级在线观看| 国产一区二区美女| 亚洲欧美色图视频| 成人福利在线视频| 国产成人亚洲综合a∨婷婷| 日韩xxxx视频| 亚洲经典中文字幕| 亚洲国产日韩在线观看| 真实国产乱子伦对白视频| 91av视频在线| 91精品国产综合久久久蜜臀图片| 欧美国产97人人爽人人喊| 懂色av蜜桃av| 久久精品一卡二卡| 成年人的黄色片| 亚洲久久在线观看| 亚洲男女视频在线观看| 国产在线播放一区| 波多野结衣中文字幕一区| 国产无人区一区二区三区| 国产精品100| 日本aaa视频| 99久re热视频精品98| 国产二区一区| 国产成人一区二区三区| 97在线免费观看| 国产午夜精品麻豆| 精品国产乱码一区二区三 | 精品国自产在线观看| 熟妇无码乱子成人精品| 欧美日韩一道本| 一道精品一区二区三区| 欧美日本高清视频在线观看| 午夜激情久久久| 成人av在线网| 久久久精品免费网站| 99这里只有精品| **性色生活片久久毛片| 色一情一乱一乱一91av| 国产欧美日韩久久| 老司机免费视频一区二区| 97精品久久人人爽人人爽| 日韩欧美亚洲视频| 国产又大又黄视频| 亚洲综合五月天婷婷丁香| 日本50路肥熟bbw| 国产一区喷水| 九九九久久国产免费| 欧美性猛交xxxx黑人| 国产精品一区免费在线观看| 中文在线免费看视频| 国产精品视频久久久久久| 国产又黄又粗又猛又爽| 99久久国产热无码精品免费| 欧美亚洲第一页| 99在线热播精品免费| 日韩精品视频一二三| 81精品国产乱码久久久久久| 狠狠色香婷婷久久亚洲精品| 成a人片亚洲日本久久| 日韩欧美激情视频| 手机版av在线| 日韩视频 中文字幕| 国产区一区二区三区| 欧美极品在线播放| 337p日本欧洲亚洲大胆色噜噜| 国产亚洲人成网站| 日本特黄久久久高潮| 亚洲一区在线观| 殴美一级黄色片| 亚洲精品视频导航| 亚洲国产欧洲综合997久久| 日本久久亚洲电影| 亚洲成人网在线观看| 欧美精品乱码久久久久久按摩| 亚洲午夜视频在线| 久久久久一区二区三区四区| 另类欧美日韩国产在线| 国产麻豆91视频| 在线播放成人av| 日本熟妇一区二区三区| av中文在线播放| 久久高清无码视频| 欧美特级一级片| 久久久久久久久久免费视频| 免费看特级毛片| 国产亚洲第一页| 国产一级二级三级| 免费在线观看av网址| 成人三级视频在线观看| 少妇一级淫免费放| 亚洲视频综合在线| 国产一区二区免费看| 久久久久久久欧美精品| 亚洲精品久久久狠狠狠爱 | 品久久久久久久久久96高清| 激情欧美一区二区三区中文字幕| 国产在线一区二区三区| 国产精品自产拍在线观| 欧美一区视频在线| 日韩av高清不卡| 国产成人女人毛片视频在线| 国产在线一区二区三区播放| 亚洲一区二区在线观| 国产在线播放观看| 九九九九九国产| www日韩在线| 亚洲av无码乱码国产精品久久| 天堂在线资源8| 成人精品国产福利| 成人美女视频在线观看18| 久久精品一区二区三区av| 日韩欧美亚洲国产一区| 欧美久久高跟鞋激| 久久综合伊人77777| 国产日韩欧美在线| 日本aa在线观看| 东京热av一区| 国产尤物视频在线观看| 国产伦精品一区二区三区免费| 亚洲精品国产a| 精品视频久久久久久久| 成人精品一区二区三区电影免费| 欧美国产激情视频| 91插插插插插插| 国产美女精品一区二区三区| 亚洲一区中文在线| 乱亲女秽乱长久久久| 日本精品免费| 性欧美精品男男| 久久久久99| 欧美日韩在线免费观看| 久久久噜噜噜久久中文字免| 白白操在线视频| 精品在线视频免费观看| av一区二区三区四区| 欧美一区二区三区思思人| 日韩av电影在线播放| 国内国产精品天干天干| 欧美在线 | 亚洲| 欧美亚洲国产bt| 99久久99| 极品尤物一区二区| 久久亚洲一区二区三区四区| 在线观看日韩视频| 熟女少妇在线视频播放| 一级做a爰片久久毛片16| 精品久久久一区| 国产在线久久久| av无码一区二区三区| 99久久久免费精品国产一区二区| 最好看的2019年中文视频| 日本高清无吗v一区| 国产精品美女黄网| 在线免费日韩av| 欧美日韩亚洲激情| 日韩欧美精品在线不卡| www.久久网| 在线成人高清不卡| 人人妻人人澡人人爽欧美一区| 五月天婷婷丁香| 欧美优质美女网站| 亚洲电影网站| av免费观看不卡| 粉嫩在线一区二区三区视频| 中文字幕一精品亚洲无线一区| 国产真人做爰毛片视频直播| 91精品国产乱码久久| 欧美xingq一区二区| 日本一道在线观看| ww国产内射精品后入国产| 久久久久久高清| 天涯成人国产亚洲精品一区av| 成人在线看片| 在线不卡免费视频|