欧美三区四区_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ù)據的腳本:

復制代碼 代碼如下:www.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
復制代碼 代碼如下:www.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í)行:

復制代碼 代碼如下:www.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ù)據庫教程
福利片一区二区| 少妇特黄一区二区三区| 国产女人爽到高潮a毛片| 国模 一区 二区 三区| 天天亚洲美女在线视频| 国产精品成av人在线视午夜片| 热久久久久久久久| 欧美理论影院| 激情综合五月天| 亚洲护士老师的毛茸茸最新章节| 亚洲国内在线| 久久精品免费av| 日韩av在线播放网址| 夜夜嗨av一区二区三区中文字幕| 欧美在线观看网址综合| 日本精品一区在线| 欧美一区久久久| 国产伦精一区二区三区| 亚洲欧美一区二区三区在线 | 你懂的亚洲视频| 欧美视频在线看| 99九九视频| 少妇太紧太爽又黄又硬又爽小说| 欧美天堂影院| 亚洲精品一区二区三区影院| 中文字幕欧美日韩va免费视频| 日韩精品福利片午夜免费观看| 好吊操这里只有精品| 忘忧草精品久久久久久久高清| 五月激情综合网| 91午夜理伦私人影院| 黄色正能量网站| 草草视频在线一区二区| 国产精品久久一卡二卡| 97高清免费视频| 狠狠热免费视频| 日本韩国在线观看| 国产精品小仙女| 在线视频日本亚洲性| 日韩xxxx视频| 国产色综合视频| 日本欧美一区二区| 日韩精品在线电影| 欧美a级免费视频| 一道本在线视频| 奇米一区二区三区av| 亚洲免费视频一区二区| 精品无码国模私拍视频| av在线亚洲天堂| 国产在线看一区| 精品国产一区二区三区在线观看 | 欧美日韩精品一区二区视频| 舔着乳尖日韩一区| 国产精品精品软件视频| 欧美又粗又大又长| 欧美日韩国产高清| 欧美一区二区三区视频在线| 天堂v在线视频| 一级黄色大片免费| 精品无人码麻豆乱码1区2区| 久久亚洲精品一区二区| 亚洲精品mv在线观看| 国产精品一区二区美女视频免费看 | 久久精选视频| 亚洲午夜久久久久久久| 免费观看成人网| 91超碰碰碰碰久久久久久综合| 国产婷婷色一区二区三区| 国产suv精品一区二区三区88区| 免费观看av网站| 精品av一区二区| 欧美日免费三级在线| 亚洲一卡二卡区| 国产精品爽爽爽| 色国产在线视频| 免费视频观看成人| 中文字幕一区二区三区蜜月| 91免费高清视频| 婷婷在线精品视频| 亚洲激情视频| 亚洲欧美日韩天堂| 中国黄色片一级| 亚洲码欧美码一区二区三区| 香蕉av福利精品导航| 欧美激情专区| 亚洲天堂男人网| 国产精品91一区二区| 97视频在线观看成人| 强伦人妻一区二区三区| 天天射综合网视频| 欧美va亚洲va在线观看蝴蝶网| 成熟丰满熟妇高潮xxxxx视频| 91tv亚洲精品香蕉国产一区| 综合网在线视频| 国产欧美欧洲| 性高潮视频在线观看| 国产一区三区三区| 91精品国产色综合久久不卡98口 | 日本午夜精品| 欧美色中文字幕| 黄色一级大片免费| 欧美黑人一区| 一区二区高清在线| 日韩国产高清一区| 亚洲av无码乱码在线观看性色| 久久日一线二线三线suv| 成人久久久久久| www成人在线| 国产综合色在线| 5566成人精品视频免费| 亚洲熟女毛茸茸| 免费亚洲一区| 久久99久久亚洲国产| 午夜在线观看一区| 亚洲福利久久| 大量国产精品视频| 日本一级免费视频| 亚洲福利电影| 久久久久久99精品| 精品对白一区国产伦| 99视频在线视频| 欧美大片网址| 日韩亚洲欧美成人一区| 99视频精品免费| 加勒比色老久久爱综合网| 欧美日韩一区小说| 久久精品.com| 蜜桃久久久久| 日韩精品专区在线影院重磅| 亚洲综合av在线播放| 国产不卡一二三区| 日韩av在线高清| aaa黄色大片| 欧美日韩天堂| 欧美成aaa人片在线观看蜜臀| 日本一区二区视频在线播放| 99av国产精品欲麻豆| 欧美乱大交xxxxx| 黑人狂躁日本娇小| 美女视频网站久久| 国产黑人绿帽在线第一区| 日韩成人免费在线观看| 国产成人免费在线观看| 91亚洲国产成人久久精品网站| 精品乱码一区内射人妻无码| 久久亚洲综合av| 久久国产精品 国产精品| 日韩在线一区二区三区四区| 亚洲国产美女搞黄色| www.欧美黄色| 2023国产精华国产精品| 日韩欧美卡一卡二| 美女网站视频在线观看| 精品动漫一区| 高清视频欧美一级| 亚洲激情视频一区| 国产91精品一区二区| 成人做爰66片免费看网站| 亚洲AV无码乱码国产精品牛牛| 亚洲亚洲精品在线观看| 免费高清一区二区三区| 成人香蕉社区| 亚洲国产中文字幕久久网| 在线观看国产网站| 日韩av一区二区三区四区| 国产成人精品999| 国产第一页在线观看| 国产精品乱人伦| 麻豆视频传媒入口| 欧美人与动xxxxz0oz| 日韩精品免费视频| 天堂在线中文视频| 国内精品在线播放| 国产精品久久久久久久小唯西川 | 手机看片福利日韩| 午夜国产一区二区| 欧美激情视频播放| 亚洲欧美偷拍视频| 亚洲视频你懂的| 久久综合久久网| 精品福利久久久| 久久综合伊人77777| 四虎永久在线精品| 国产日韩欧美a| 麻豆映画在线观看| 亚洲色图美女| 久久久av电影| www.毛片.com| 亚洲视频免费看| 成人午夜视频在线观看免费| 欧美精品一区二区三区精品| 色综合色综合久久综合频道88| 中文字幕亚洲精品在线| 国产精品毛片久久久久久久| 精品免费久久久久久久| 欧美伦理在线视频| 欧美激情视频网| a片在线免费观看| 亚洲伊人伊色伊影伊综合网| 成人在线看视频| 综合色一区二区| 亲子乱一区二区三区电影| 国产欧美久久久精品免费| 欧美午夜xxx| 成人免费播放视频| 日韩激情一二三区| 国产精品一区二区欧美| **国产精品| 亚洲精品一区久久久久久| 欧美卡一卡二卡三| 国产精品污污网站在线观看| 大陆av在线播放| 91精品综合| 国产精品久久视频| 高潮一区二区| 日韩欧美国产一区在线观看| 国产99在线 | 亚洲| 91免费国产在线观看| 特色特色大片在线| 精品国产91乱码一区二区三区四区| 欧美激情a在线| 国产精品女同一区二区| 欧美最新大片在线看| 在线观看av中文字幕| 成人中文字幕电影| 亚洲成人动漫在线| 色综合久久网| 国产精彩精品视频| 免费观看欧美大片| 精品无码久久久久久国产| 精品无码人妻一区二区三| 亚洲人被黑人高潮完整版| 男女视频在线看| 日本成人在线不卡视频| 日本一区视频在线| 国产成人三级| 日韩免费在线观看视频| 亚欧在线观看视频| 日韩av网址在线观看| 国产精品theporn动漫| 亚洲国产精品久久一线不卡| 手机在线观看日韩av| 国产毛片精品一区| 欧美精品一区二区性色a+v| 国产精品99一区二区三区| 日韩免费观看av| 国产综合色区在线观看| 亚洲视频在线观看免费| 男人天堂视频网| 欧美伊人久久大香线蕉综合69| caopeng视频| 中文字幕永久在线观看| 国产综合自拍| 高清不卡日本v二区在线| 综合激情久久| 久久久久久久久久婷婷| 色噜噜在线播放| 国产网站欧美日韩免费精品在线观看 | 91精品婷婷国产综合久久性色 | 久久综合九色综合97_久久久| 9久久9毛片又大又硬又粗| 亚洲综合日韩| 日韩黄色影视| 亚洲色图插插| 国产精品播放| 国产欧美日韩| 成人在线视频网| 国产精品视频3p| 日韩av色在线| 午夜不卡一区| 欧美精品久久久久久久久久| 天天综合网天天综合| 伊人久久免费视频| 国产女人18毛片水18精| 日韩成人在线视频| 狠狠躁夜夜躁人人爽视频| 91麻豆精品91久久久久同性| 久久久久久久极品内射| 黑人精品xxx一区一二区| 久久精品成人av| 亚洲男同1069视频| 国产熟女高潮一区二区三区| 欧美国产精品久久| 亚洲丝袜在线观看| 久久奇米777| 久久综合在线观看| 国产一区二区三区日韩精品| 黑人巨大精品欧美一区二区| av黄色一级片| 国产精品区一区二区三区| 欧洲成人午夜精品无码区久久| 久久综合成人精品亚洲另类欧美| 精品亚洲一区二区三区四区| 国产aⅴ综合色| 91香蕉视频导航| 成人白浆超碰人人人人| www.99在线| 成人看片黄a免费看在线| 亚洲综合色在线观看| 成人污污视频在线观看| 香蕉视频禁止18| 久久久精品tv| 国产精品视频分类| 成人av片在线观看| 污网站在线免费| 2019国产精品| 亚洲911精品成人18网站| 国产色产综合色产在线视频| 性活交片大全免费看| 国产精品每日更新| 中文字幕丰满孑伦无码专区| 伊人性伊人情综合网| 久99久在线视频| 免费a级片在线观看| 亚洲午夜女主播在线直播| 色婷婷视频在线| 91麻豆免费看| 激情五月综合色婷婷一区二区| 日韩欧美不卡| 久久一区二区三区av| 激情综合在线| 91大学生片黄在线观看| 精品在线播放免费| 亚洲狼人综合干| 久久久久久电影| 野外性满足hd| 好吊成人免视频| 日韩免费不卡视频| 日韩精品一区二区三区在线播放 | 最新日韩av| 精品无码av无码免费专区| 久久精品国产一区二区| 国产视频一区二区视频| 久久先锋影音av| 免费看黄色aaaaaa 片| 婷婷综合另类小说色区| 国产精品99精品| 精品国产一区二区在线观看| 99热这里只有精品在线观看| 久久人人爽人人爽人人片亚洲| 视频欧美精品| 成人黄色免费片| 图片小说视频色综合| 激情五月五月婷婷| 国产精品一级二级三级| 特种兵之深入敌后| 亚洲一区在线电影| 男人的天堂一区二区| 日韩精品在线影院| 日韩免费电影| 国产精品精品久久久| 久久免费av| 日本xxx免费| 成人性生交大片免费看视频在线 | 欧美日韩亚洲一区二区三区在线观看 | 欧洲亚洲免费视频| 视频一区中文| 亚洲激情啪啪| 国产一区中文字幕| 日本五十肥熟交尾| 欧美性xxxx18| 在线观看国产成人| 久久福利网址导航| 久久精品色播| 欧美一区二区在线| 美女网站色91| 2018国产精品| 色菇凉天天综合网| 97精品人妻一区二区三区在线 | 国产成人精品白浆久久69| 91国产视频在线播放| 国产亚洲一卡2卡3卡4卡新区| 亚洲三区视频| 国产91在线看| a级大片在线观看| 欧美丰满少妇xxxxx高潮对白| 国产xxxx在线观看| 91av视频在线播放| 国产精品白浆一区二小说| 91麻豆精品国产91久久久资源速度| 国产口爆吞精一区二区| 欧美黄色www| 美女毛片一区二区三区四区| 亚洲国产一区二区在线| 91精品综合久久| 成人看片网站| 91久久在线播放| 国产亚洲成人一区| www.精品在线| 亚洲电影一级黄| 亚洲av中文无码乱人伦在线视色| 在线观看久久av| 成人线上播放| 亚洲精品免费在线看| 成人精品亚洲人成在线| 成人在线手机视频| 蜜桃视频一区二区三区在线观看| 高清av免费看| 天天操天天综合网| 在线免费一级片|