|  | 设为首页 加入收藏 联系我们 |

|  | 首 页 行业资讯 网站运营 网络编程 数 据 库 网页设计 网络安全 网站推广 平面设计 服 务 器 商城 |

| 站内搜索： 热门Tag： 淘特 CMS 门户 信息港 房产 汽车 旅游 分类信息 下载 JspCms 内容管理系统 更多>> |

现在位置：首页> 数 据 库

编辑推荐
?SQL实现最优坐地铁方案
?SQL Server存储过程命名标准
?SQL Server 2008性能和可扩..
?SQL Server存储过程编写和优化措..
?使用SQL Server 2008进行服..
?SQL server服务器大内存配置
?SQL Server 2005数据库分区..
?Access中使用SQL语句应掌握的几点..
?一条语句简单解决“每个Y的最新X”的SQ..
?SQL Server 2008之备份压缩

热门点击
·Oracle 11g数据库移植
·Access中使用SQL语句应掌握的几点..
·SQL Server存储过程编写和优化措..
·SQL server服务器大内存配置
·SQL实现最优坐地铁方案
·SQL Server存储过程命名标准
·一条语句简单解决“每个Y的最新X”的SQ..
·用SQL语句实现随机查询数据并不显示错误..
·微软SQL Server 2008数据仓..
·使用SQL Server 2008进行服..

图片推荐
· | ·

SQL实现最优坐地铁方案
作者： 日期：2013-08-19 出处： 点击:

坐地铁有时候不一定要坐最少站的，有时是希望能坐换乘次数最少的，应该怎么改造才能把所有的方案都取出来，然后按换乘次数、经过站点数依次排序? lineID state orderid 1 广州东 1 1 体育中心2 1 体育西 3 1 烈士陵园4 1 公园前 6 1 西门口 7 2 火车站 1 2 纪念堂 2 2 公园前 3 2 中大 4 2 客村 5 2 琶洲 6 2 万胜围 7 3 广州东 1 3 体育西 2 3 珠江新城3 3 客村 4 3 市桥 5 4 万胜围 1 4 金洲 2 如上面数据，想查询“广州东”至“中大”，大家通过程序计算列出全部的方案。 Peak Wong： SQL code
DECLARE @tb TABLE( lineID int, state nvarchar(10), orderid int) INSERT @tb SELECT 1, N'广州东', 1 UNION ALL SELECT 1, N'体育中心', 2 UNION ALL SELECT 1, N'体育西', 3 UNION ALL SELECT 1, N'烈士陵园', 4 UNION ALL SELECT 1, N'公园前', 6 UNION ALL SELECT 1, N'西门口', 7 UNION ALL SELECT 2, N'火车站', 1 UNION ALL SELECT 2, N'纪念堂', 2 UNION ALL SELECT 2, N'公园前', 3 UNION ALL SELECT 2, N'中大', 4 UNION ALL SELECT 2, N'客村', 5 UNION ALL SELECT 2, N'琶洲', 6 UNION ALL SELECT 2, N'万胜围', 7 UNION ALL SELECT 3, N'广州东', 1 UNION ALL SELECT 3, N'体育西', 2 UNION ALL SELECT 3, N'珠江新城', 3 UNION ALL SELECT 3, N'客村', 4 UNION ALL SELECT 3, N'市桥', 5 UNION ALL SELECT 4, N'万胜围', 1 UNION ALL SELECT 4, N'金洲', 2 DECLARE @state_start nvarchar(10), @state_stop nvarchar(10) SELECT @state_start = N'广州东', @state_stop = N'中大' -- 查询 DECLARE @re TABLE( path nvarchar(max), state_count int, start_lineID int, start_state nvarchar(10), current_lineID int, current_state nvarchar(10), current_orderid int, flag int, lineIDs nvarchar(max), level int ) DECLARE @level int, @rows int SET @level = 0 -- 开始 INSERT @re SELECT path = CONVERT(nvarchar(max), RTRIM(A.lineID) + N'{' + RTRIM(A.orderid) + N'.' + A.state ), state_count = 0, start_lineID = A.lineID, start_state = A.state, current_lineID = A.lineID, current_state = A.state, current_orderid = A.orderid, flag = CASE WHEN A.state = @state_stop THEN 0 ELSE NULL END, lineIDs = ',' + RTRIM(A.lineID) + ',', level = -(@level + 1) FROM @tb A WHERE state = @state_start SET @rows = @@ROWCOUNT WHILE @rows > 0 BEGIN SELECT @level = @level + 1 INSERT @re -- 同一 LineID SELECT path = CONVERT(nvarchar(max), A.path + N'->' + RTRIM(B.orderid) + N'.' + B.state ), state_count = A.state_count + 1, A.start_lineID, A.start_state, current_lineID = B.lineID, current_state = B.state, current_orderid = B.orderid, flag = CASE WHEN B.state = @state_stop THEN 0 ELSE A.flag END, A.lineIDs, level = @level FROM @re A, @tb B WHERE A.flag <> 0 AND A.level = @level - 1 AND A.current_lineID = B.lineID AND A.current_orderid + A.flag = B.orderid UNION ALL -- 不同 LineID SELECT path = CONVERT(nvarchar(max), A.path + N')->' + RTRIM(B.lineID) + N'{' + RTRIM(B.orderid) + N'.' + B.state ), state_count = A.state_count + 1, A.start_lineID, A.start_state, current_lineID = B.lineID, current_state = B.state, current_orderid = B.orderid, flag = CASE WHEN B.state = @state_stop THEN 0 ELSE NULL END, A.lineIDs + RTRIM(B.lineID) + ',', level = - @level FROM @re A, @tb B WHERE A.flag <> 0 AND state_count = @level - 1 AND A.current_lineID <> B.lineID AND A.current_state = B.state AND NOT EXISTS( SELECT * FROM @re WHERE CHARINDEX(',' + RTRIM(B.lineID) + ',', A.lineIDs) > 0) SET @rows = @@ROWCOUNT INSERT @re -- 不同 LineID 的第1站正向 SELECT path = CONVERT(nvarchar(max), A.path + N'->' + RTRIM(B.orderid) + N'.' + B.state ), state_count = A.state_count + 1, A.start_lineID, A.start_state, current_lineID = B.lineID, current_state = B.state, current_orderid = B.orderid, flag = CASE WHEN B.state = @state_stop THEN 0 ELSE 1 END, A.lineIDs, level = @level FROM @re A, @tb B WHERE A.flag IS NULL AND A.level = - @level AND A.current_lineID = B.lineID AND A.current_orderid + 1 = B.orderid UNION ALL -- 不同 LineID 的第1站反向 SELECT path = CONVERT(nvarchar(max), A.path + N'->' + RTRIM(B.orderid) + N'.' + B.state ), state_count = A.state_count + 1, A.start_lineID, A.start_state, current_lineID = B.lineID, current_state = B.state, current_orderid = B.orderid, flag = CASE WHEN B.state = @state_stop THEN 0 ELSE - 1 END, A.lineIDs, level = @level FROM @re A, @tb B WHERE A.flag IS NULL AND A.level = - @level AND A.current_lineID = B.lineID AND A.current_orderid - 1 = B.orderid SET @rows = @rows + @@ROWCOUNT END SELECT -- *, path = path + N'}', state_count FROM @re WHERE flag = 0
结果(数字5,7是要经过多少站: 3{1.广州东-> 2.体育西-> 3.珠江新城-> 4.客村)-> 2{5.客村-> 4.中大} 5 1{1.广州东-> 2.体育中心-> 3.体育西)-> 3{2.体育西-> 3.珠江新城-> 4.客村)-> 2{5.客村-> 4.中大} 7
上一篇：SQL server服务器大内存配置 下一篇：SQL Server存储过程命名标准

[1]

- 返回首页
- 打印本文
- 加入收藏
- 返回顶部
- 关闭窗口

相关文章 | 查看留言 发表评论
用 户： |
内 容： |
验证码： |

关于本站　|　免责声明　|　联系我们　|　版权隐私　|　友情链接　|网站地图 | SiteMap
联系电话：0531-88511191 | 客服QQ：6410861 | Email：totcms@163.com | ICP备：88888号 Copyright © TotCms.com All Rights Reserved. 济南淘网科技 版权所有