欧美三区四区_av先锋影音资源站_亚洲第一论坛sis_影音先锋2020色资源网_亚洲精品社区_在线免费观看av网站_国产一区二区伦理_亚洲欧美视频一区二区_99视频精品全部免费在线_精精国产xxxx视频在线

在SQL Server中實現(xiàn)最短路徑搜索的解決方法_Mssql數(shù)據庫教程

編輯Tag賺U幣

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

開始

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

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

圖1.

解析:

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

圖2.

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

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

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

第1方法是,

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


圖3.

第2方法是,

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

圖4.

實現(xiàn):

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

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

復制代碼 代碼如下:m.ghpqjb.com

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
復制代碼 代碼如下:m.ghpqjb.com

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作為中心進行搜索時候,作為能否循環(huán)搜索的標記
@RelatedNode_WhileFlag bit=1 --以@RelatedNode作為中心進行搜索時候,作為能否循環(huán)搜索的標記

--如果直接找到兩個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作為中心向外擴展的各節(jié)點數(shù)據
if object_id('tempdb..#2') Is not null Drop Table #2 --臨時表#2,存儲的是以@RelatedNode作為中心向外擴展的各節(jié)點數(shù)據

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

下面是存儲過程的執(zhí)行:

復制代碼 代碼如下:m.ghpqjb.com

use TestDB

go

exec dbo.up_GetPath

@Node = 'p',

@RelatedNode = 'j'

go

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

拓展:

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

小結:

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

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

來源:模板無憂//所屬分類:Mssql數(shù)據庫教程/更新時間:2013-04-24
相關Mssql數(shù)據庫教程
在线观看网站黄| 国产精品视频导航| 羞羞影院欧美| 草民电影神马电影一区二区| 日韩成人免费在线| 91精品国产91综合久久蜜臀| 99精品国产一区二区| 超碰97在线资源站| 国产精品成人国产| 成人精品免费视频| 国产亚洲a∨片在线观看| 国产91av视频在线观看| 日韩av片在线播放| 99久久影视| 疯狂做受xxxx高潮欧美日本| 国产一区二中文字幕在线看| 日本免费不卡一区二区| 正在播放木下凛凛xv99| 美女午夜精品| 国产精品高潮呻吟| 91精品国产电影| 欧美日韩二三区| 国产农村妇女毛片精品久久| 亚洲一区二区毛片| 日韩一区二区不卡| 日韩亚洲不卡在线| 日韩手机在线观看| 亚洲欧洲美洲一区二区三区| 色综合 综合色| 99久久久精品免费观看国产| 精品成人无码一区二区三区| xx欧美视频| 国产一区二区看久久| 日韩精品视频免费| 免费极品av一视觉盛宴| 欧美另类高清videos的特点| 日韩午夜高潮| 日韩一卡二卡三卡国产欧美| 亚洲一区三区电影在线观看| 18啪啪污污免费网站| 欧美日韩一区二区三区四区不卡 | 一区二区视频观看| 日韩视频一区二区三区四区| 欧美国产激情二区三区| 欧美孕妇性xx| 一级国产黄色片| jizz性欧美2| 亚洲色图19p| 国产欧美久久久久久| 欧美成人午夜精品免费| 农村少妇一区二区三区四区五区| 亚洲精品欧美激情| 91精品视频免费看| 97精品在线播放| 999精品视频| 欧美日韩亚洲综合| 亚洲丰满在线| 中文字幕在线观看免费| 欧美bbbbb| 永久免费毛片在线播放不卡| 99久久国产宗和精品1上映| 亚洲黄色中文字幕| 爽爽淫人综合网网站| 欧美午夜视频网站| 欧美日韩综合另类| 伊人中文字幕在线观看| 性高湖久久久久久久久| 精品无人国产偷自产在线| 国产一区二区网| 亚洲精品mv| 国产午夜精品一区二区| 国产精品欧美在线| 四虎地址8848| 综合精品一区| 精品福利一二区| 日韩精品最新在线观看| 亚洲精品91天天久久人人| 久久精品国产久精国产| 久久久精品一区二区| www激情五月| 自拍偷拍欧美视频| 久久午夜羞羞影院免费观看| 国产精品91久久久| av黄色免费在线观看| 中文字幕免费一区二区| 精品久久久久久无| 日本一区二区黄色| 成人亚洲视频| 亚洲精品久久嫩草网站秘色| 国产伦精品一区二区三区高清| 特一级黄色大片| 蜜臀久久99精品久久久画质超高清| 日韩在线播放av| 亚洲精品成人无码毛片| 蜜臀av免费一区二区三区| 欧美午夜精品一区二区蜜桃| 影音先锋成人资源网站| 亚洲婷婷久久综合| 精品一区二区av| 久久久久久久999| mm131丰满少妇人体欣赏图| 99精品在线观看| 亚洲成人激情在线| 天天爽人人爽夜夜爽| 亚洲大奶少妇| 欧美在线观看18| 日韩欧美精品免费| 久久69成人| 夜色激情一区二区| 日韩激情久久| 国产特级黄色片| 国产三级三级三级精品8ⅰ区| 亚洲www在线观看| 在线免费黄色av| 国产aⅴ综合色| 国产精品热视频| 99精品视频99| 国产精品亚洲成人| 国产精品都在这里| 日韩美女黄色片| 激情伊人五月天久久综合| 国产69久久精品成人| 日本高清一二三区| 香港欧美日韩三级黄色一级电影网站| 精品国产麻豆免费人成网站| 亚洲色图 在线视频| 日本三级久久| 日韩精品最新网址| 亚洲综合伊人久久| 成人激情视频| 亚洲欧美精品一区| 亚洲成av人片在线观看无| 91精品国产成人观看| 亚洲性视频网址| 日韩 中文字幕| 极品av少妇一区二区| 久久av红桃一区二区小说| 国产又粗又猛又爽又黄的视频四季| 性高湖久久久久久久久| 国产69精品久久久久久| 国产无码精品在线观看| 一本色道88久久加勒比精品| 欧美大胆在线视频| 黄色录像免费观看| 久久99国产精品成人| 国产福利精品av综合导导航| 国产又黄又粗又爽| 99久久久国产精品| 国产mv免费观看入口亚洲| 久久精品免费在线| 国产99久久久久久免费看农村| 91色琪琪电影亚洲精品久久| 中文字幕在线观看1| 国产精品欧美经典| 亚洲国内在线| 久久久久伊人| 欧美日韩高清一区二区不卡| 色婷婷成人在线| 五月亚洲婷婷| 日韩一区二区三区av| 91精品视频国产| 欧美成人69| 欧美激情亚洲一区| 国产一级片免费观看| 成人国产电影网| 国产专区一区二区| 亚洲av激情无码专区在线播放| 图片区小说区区亚洲影院| 亚洲 自拍 另类小说综合图区| 18国产精品| 亚洲国产成人在线视频| 欧美熟妇精品黑人巨大一二三区| 香蕉精品999视频一区二区| 国产黑人绿帽在线第一区| 中文字幕人妻一区二区在线视频| 成人欧美一区二区三区白人| 欧美做受777cos| 免费看日产一区二区三区| 欧美性生交大片免费| 人妻内射一区二区在线视频| 日韩电影免费在线观看| 亚洲精品国产品国语在线| 亚洲永久无码7777kkk| 秋霞电影网一区二区| 96sao精品视频在线观看| 免费观看国产视频| 91国偷自产一区二区三区成为亚洲经典 | 亲子乱一区二区三区电影| 人人妻人人藻人人爽欧美一区| 亚洲高清激情| 欧美一级电影免费在线观看| 国产在线观看第一页| 亚洲欧美色一区| 奇米精品一区二区三区| 日韩中文在线电影| 欧美黑人一区二区三区| 国产精品va无码一区二区三区| 国产精品久久夜| 搞av.com| 欧美国产一区二区三区激情无套| 欧美激情欧美激情在线五月| 国产在线一级片| 亚洲一区二区三区四区的| 91传媒久久久| 天天精品视频| 国产91精品久| a级片免费观看| 国产精品二区一区二区aⅴ污介绍| 300部国产真实乱| japanese国产精品| 性欧美在线看片a免费观看| 中文字幕第31页| 狠狠躁夜夜躁久久躁别揉| 国产精品久久久久久久av福利| 国产欧美亚洲一区| 亚洲精品免费一区二区三区| 欧美成人精品三级网站| 精品国产一区二区精华| 东京热无码av男人的天堂| 91久色porny| 男人天堂网站在线| 欧美成人精品一区二区三区在线看| 久久免费福利视频| 99久久免费国产精精品| 欧美性一二三区| 黄色正能量网站| 不卡视频一二三四| 欧美精品在欧美一区二区| 婷婷综合视频| 国产精品国产亚洲伊人久久 | 亚洲人精品午夜在线观看| 久久亚洲成人av| 1区2区3区精品视频| 亚洲少妇第一页| 久久国产精品99国产| 国产精品一区二区三区不卡 | 日韩美女视频中文字幕| 六月婷婷中文字幕| 日韩精品一区二区三区老鸭窝| 免费黄色激情视频| 国产精品久久影院| 国产wwwxx| 蜜芽一区二区三区| 亚洲国产一区在线| 国产高清久久| 成人黄色大片在线免费观看| 日韩黄色三级在线观看| 3751色影院一区二区三区| www..com.cn蕾丝视频在线观看免费版 | 免费在线激情视频| 国产情侣一区| 久久大片网站| 澳门成人av网| 亚洲国产精品视频在线观看| 国产一级视频在线| 亚洲国产日韩a在线播放| 99免费观看视频| 成人深夜视频在线观看| 丁香色欲久久久久久综合网| 嫩草影视亚洲| 日本91av在线播放| av有声小说一区二区三区| 亚洲裸体xxxx| 波多野结衣一本一道| 欧美视频在线播放| 国产第一页浮力| 一区二区国产视频| 色婷婷精品久久二区二区密| 91麻豆蜜桃一区二区三区| 精品一区二区中文字幕| 日韩精品久久理论片| 茄子视频成人在线观看| 欧美aaaaaaaaaaaa| 2019国产精品视频| 天堂日韩电影| 日韩美女主播视频| 国产成人视屏| 性色av一区二区三区红粉影视| 91精品国自产在线偷拍蜜桃| 亚洲人成欧美中文字幕| 中文字幕av影视| 精品日韩在线观看| 91久久国产视频| 精品视频在线视频| 真实国产乱子伦对白在线| 国产欧美1区2区3区| 一级黄色特级片| 成人综合激情网| 黄色片久久久久| 久久精品国产免费| 国产精品久久久久久久乖乖| 日日摸夜夜添夜夜添亚洲女人| 在线天堂一区av电影| 禁久久精品乱码| 亚洲国产日韩综合一区| 黄色亚洲免费| 亚洲精品无人区| 亚洲伦理精品| 中日韩在线视频| 亚洲国产91| 在线不卡视频一区二区| 亚洲免费播放| 在线观看成人一级片| 午夜在线播放视频欧美| 中文字幕av日韩精品| 亚洲综合社区| 久久综合亚洲精品| 蜜臀av性久久久久蜜臀aⅴ| 久久精品无码中文字幕| 美女一区二区视频| 国产特级淫片高清视频| 国产尤物一区二区| 又色又爽又高潮免费视频国产| 国产高清久久久| 日本xxxx黄色| 久久久九九九九| 日本一区二区免费视频| 国产精品护士白丝一区av| 四虎影成人精品a片| 亚洲综合久久久| 91精品一区二区三区蜜桃| 91久久香蕉国产日韩欧美9色| 久久精品视频久久| 欧美一级精品在线| 国产又粗又黄又爽| 在线观看精品国产视频| 成人影院网站| 午夜美女久久久久爽久久| 伊人精品久久| 91网站在线免费观看| 日韩免费在线| 日韩精品另类天天更新| 久久久精品网| www一区二区www免费| 成人中文字幕在线| 人妻av一区二区三区| 一区二区三区在线观看国产| 国产美女高潮视频| 欧美日韩午夜在线视频| 青青国产在线视频| 亚洲色图35p| 色综合天天色| 国产成人精品综合久久久| 国产精品片aa在线观看| 免费精品视频一区二区三区| 亚洲欧美清纯在线制服| 国产黄页在线观看| 99久久精品99国产精品| 精品少妇人妻av一区二区三区| 夜夜精品视频一区二区| 免费一级片视频| 精品国产91洋老外米糕| 天天色综合av| 青青草成人在线| 激情五月综合| 亚洲一区二区四区| 久久精品国产精品青草| 午夜剧场在线免费观看| 亚洲免费av观看| 国产一级av毛片| 亚洲激情电影中文字幕| 日韩大尺度黄色| 国产精品久久久久久久一区探花| 青青草成人影院| 一区二区三区四区不卡| 风流少妇一区二区| 漂亮人妻被黑人久久精品| 欧美性猛交xxxx乱大交3| 无码免费一区二区三区| 精品奇米国产一区二区三区| 亚洲成人av综合| 性欧美长视频免费观看不卡| 免费成人av| 亚洲午夜精品国产| 国产精品99久久久久| aaa黄色大片| 色综合中文综合网| 亚洲专区在线播放| 欧美日韩xxxxx| 亚洲调教一区| 亚洲视频在线观看日本a| 国产精品18久久久久久久久| 丰满岳乱妇一区二区| 欧美性大战久久久久久久蜜臀 | 青青久久av北条麻妃海外网| 欧美在线色图| 久久精品在线免费视频| 91麻豆国产精品久久| 亚洲天堂精品一区| 欧美mv日韩mv| 欧美三区四区| 亚洲wwwav| 日韩中文字幕1| 韩国三级hd中文字幕有哪些| 欧美色另类天堂2015| 亚洲综合网av| 国产91精品久久久久久久| 希岛爱理av一区二区三区| 日韩视频免费播放| 国产精品成人免费在线|