WEB开发网
开发学院数据库MSSQL Server SQL与最短路径算法 阅读

SQL与最短路径算法

 2007-05-15 09:31:32 来源:WEB开发网   
核心提示: 0:5/1:7/2:11*/点评:上面的方法的缺点是不能列出所有的路径,只能列出最短路径其中一条5的列表中没有7,SQL与最短路径算法(2),是不是可以认为5不认识7,那么5也不认识11,到7为止--结果/*0:5→1:30→2:21→3:7注解5通过30,2

0:5/1:7/2:11

*/

点评:上面的方法的缺点是不能列出所有的路径,只能列出最短路径其中一条

5的列表中没有7,是不是可以认为5不认识7,那么5也不认识11,谈何5-11-7是最短路径?

--按照你说的逻辑,步骤如下

--1.建立查询函数

CREATE FUNCTION dbo.F_RouteSearch
(
@START INT,
@END INT
)
RETURNS VARCHAR(200)
AS
BEGIN
DECLARE @NODE INT
DECLARE @COUNT INT
DECLARE @RESULT VARCHAR(100)
SET @COUNT=0
SET @RESULT=''
DECLARE @TMP TABLE
(
ID INT,
F_ID VARCHAR(20),
STEP INT
)
INSERT INTO @TMP SELECT @START,(SELECT F_ID FROM LIST WHERE ID=@START),@COUNT
WHILE @END NOT IN (SELECT ID FROM @TMP)
BEGIN
SET @COUNT=@COUNT+1
INSERT INTO @TMP
SELECT DISTINCT a.ID,a.F_ID,@COUNT FROM List a,@TMP b WHERE CHARINDEX(','+RTRIM(a.ID)+',',','+b.F_ID+',')>0 and a.ID not in (SELECT ID FROM @TMP)
IF @@ROWCOUNT=0
BEGIN
SELECT @RESULT='NO ROUTE FIND'
GOTO RETURNHANDLE
END
END
SELECT @RESULT=RTRIM(@COUNT)+':'+RTRIM(@END)
WHILE @COUNT>1
BEGIN
SET @COUNT=@COUNT-1
SELECT TOP 1 @END=ID FROM @TMP WHERE STEP=@COUNT AND CHARINDEX(','+RTRIM(@END)+',',','+F_ID+',')>0
SELECT @RESULT=RTRIM(@COUNT)+':'+RTRIM(@END)+'→'+@RESULT
END
SELECT @RESULT='0:'+RTRIM(@START)+'→'+@RESULT
RETURNHANDLE:
RETURN @RESULT
END
GO

--准备测试数据(与LZ提供数据相同)

insert into list
select 5,'1,30,3' union all
select 7,'9,5,8' union all
select 10,'7,21,30' union all
select 11,'7,5,30' union all
select 21,'7,66,30' union all
select 30,'21,88,99'
go

--测试

select dbo.F_RouteSearch(5,7) --从5开始,到7为止

--结果

/*

0:5→1:30→2:21→3:7

注解

5通过30,21最后找到7,耗费3步完成

5不认识11,因此LZ所说的路径5-11-7不成立

*/

--List表生成脚本

CREATE TABLE [List] (
[id] [int] NULL ,
[f_id] [varchar] (40) COLLATE Chinese_PRC_CI_AS NULL
) ON [PRIMARY]
GO

上一页  1 2 

Tags:SQL 路径 算法

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接