求优化公交线路查询效率

blunuser 2008-01-30 01:51:34
-- 模拟数据
SET NOCOUNT ON
IF OBJECT_ID(N'tempdb..#tb') IS NOT NULL
DROP TABLE #tb

CREATE TABLE #tb(
id int IDENTITY
PRIMARY KEY,
lineID int,
state nvarchar(10),
orderid int
)
INSERT #tb(
lineID, state, orderid)
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'公园前', 5 UNION ALL
SELECT 1, N'西门口', 6 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

CREATE INDEX IX_lineID
ON #tb(
lineID)

CREATE INDEX IX_state
ON #tb(
state)

CREATE INDEX IX_orderid
ON #tb(
orderid)
GO

-- 乘车路线查询
DECLARE
@state_start nvarchar(10),
@state_stop nvarchar(10)
SELECT
@state_start = N'广州东',
@state_stop = N'中大'

-- 查询
IF OBJECT_ID(N'tempdb..#re') IS NOT NULL
DROP TABLE #re
CREATE TABLE #re(
ID int IDENTITY
PRIMARY KEY,
path nvarchar(2500),
state_count int,
line_count int,
start_lineID int,
start_state nvarchar(10),
current_lineID int,
current_state nvarchar(10),
next_orderid int,
flag int,
lineIDs varchar(1000),
level int
)

CREATE INDEX IX_current_lineID
ON #re(
current_lineID )

CREATE INDEX IX_current_state
ON #re(
current_state )

CREATE INDEX IX_next_orderid
ON #re(
next_orderid )

CREATE INDEX IX_current_level
ON #re(
level )

DECLARE
@level int,
@rows int
SET
@level = 0

-- 开始
INSERT #re(
path,
state_count, line_count,
start_lineID, start_state,
current_lineID, current_state,
next_orderid, flag, lineIDs, level)
SELECT
path = CONVERT(nvarchar(4000),
RTRIM(A.lineID) + N'{'
+ RTRIM(A.orderid) + N'.' + A.state
),
state_count = 0,
line_count = 0,
start_lineID = A.lineID,
start_state = A.state,
current_lineID = A.lineID,
current_state = A.state,
next_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(
path,
state_count, line_count,
start_lineID, start_state,
current_lineID, current_state,
next_orderid, flag, lineIDs, level)
-- 同一LineID
SELECT
path = CONVERT(nvarchar(4000),
A.path
+ N'->'
+ RTRIM(B.orderid) + N'.' + B.state
),
state_count = A.state_count + 1,
A.line_count,
A.start_lineID, A.start_state,
current_lineID = B.lineID,
current_state = B.state,
next_orderid = B.orderid + A.flag,
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.next_orderid = B.orderid

UNION ALL
-- 不同LineID
SELECT
path = CONVERT(nvarchar(4000),
A.path + N')->'
+ RTRIM(B.lineID) + N'{'
+ RTRIM(B.orderid) + N'.' + B.state
),
state_count = A.state_count + 1,
line_count = A.line_count + 1,
A.start_lineID, A.start_state,
current_lineID = B.lineID,
current_state = B.state,
next_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(
path,
state_count, line_count,
start_lineID, start_state,
current_lineID, current_state,
next_orderid, flag, lineIDs, level)
-- 不同LineID 的第站正向
SELECT
path = CONVERT(nvarchar(4000),
A.path
+ N'->'
+ RTRIM(B.orderid) + N'.' + B.state
),
state_count = A.state_count + 1,
A.line_count,
A.start_lineID, A.start_state,
current_lineID = B.lineID,
current_state = B.state,
next_orderid = B.orderid + 1,
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.next_orderid + 1 = B.orderid
UNION ALL
-- 不同LineID 的第站反向
SELECT
path = CONVERT(nvarchar(4000),
A.path
+ N'->'
+ RTRIM(B.orderid) + N'.' + B.state
),
state_count = A.state_count + 1,
A.line_count,
A.start_lineID, A.start_state,
current_lineID = B.lineID,
current_state = B.state,
next_orderid = B.orderid - 1,
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.next_orderid - 1 = B.orderid

SET @rows = @rows + @@ROWCOUNT
END

SELECT
-- *,
path = path + N'}',
line_count,
state_count
FROM #re
WHERE flag = 0
以上语句可以执行 但是数据少的时候可以执行,一旦数据多了就要耗费 很长时间,效率很低. 现向各位求助, 要求提高运行效率,或者有更好的语句 效率更好 请发上来 一旦确认 马上结帐
...全文
176 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
blunuser 2008-01-31
  • 打赏
  • 举报
回复
dawugui
潇洒老乌龟(原名:爱新觉罗.毓华)
等 级:
你发的 我以前就试过了 效率更底
dawugui 2008-01-30
  • 打赏
  • 举报
回复
--最短乘车路线查询示例(邹老大的。)
CREATE TABLE T_Line(
ID nvarchar(10), --公交线路号
Station nvarchar(10), --站点名称
Orders int) --行车方向(通过它反应每个站的上一个、下一个站)
INSERT T_Line
SELECT N'8路' ,N'站A',1 UNION ALL
SELECT N'8路' ,N'站B',2 UNION ALL
SELECT N'8路' ,N'站C',3 UNION ALL
SELECT N'8路' ,N'站D',4 UNION ALL
SELECT N'8路' ,N'站J',5 UNION ALL
SELECT N'8路' ,N'站L',6 UNION ALL
SELECT N'8路' ,N'站M',7 UNION ALL
SELECT N'20路' ,N'站G',1 UNION ALL
SELECT N'20路' ,N'站H',2 UNION ALL
SELECT N'20路' ,N'站I',3 UNION ALL
SELECT N'20路' ,N'站J',4 UNION ALL
SELECT N'20路' ,N'站L',5 UNION ALL
SELECT N'20路' ,N'站M',6 UNION ALL
SELECT N'255路',N'站N',1 UNION ALL
SELECT N'255路',N'站O',2 UNION ALL
SELECT N'255路',N'站P',3 UNION ALL
SELECT N'255路',N'站Q',4 UNION ALL
SELECT N'255路',N'站J',5 UNION ALL
SELECT N'255路',N'站D',6 UNION ALL
SELECT N'255路',N'站E',7 UNION ALL
SELECT N'255路',N'站F',8
GO

--乘车线路查询存储过程
CREATE PROC p_qry
@Station_Start nvarchar(10),
@Station_Stop nvarchar(10)
AS
SET NOCOUNT ON
DECLARE @l int
SET @l=0
SELECT ID,Station,
Line=CAST('('+RTRIM(ID)+': '+RTRIM(Station) as nvarchar(4000)),
Orders=Orders,
[Level]=@l
INTO # FROM T_Line
WHERE Station=@Station_Start
WHILE @@ROWCOUNT>0
AND NOT EXISTS(SELECT * FROM # WHERE Station=@Station_Stop)
BEGIN
SET @l=@l+1
INSERT #(Line,ID,Station,Orders,[Level])
SELECT
Line=a.Line+CASE
WHEN a.ID=b.ID THEN N'->'+RTRIM(b.Station)
ELSE N') ∝ ('+RTRIM(b.ID)
+N': '+RTRIM(b.Station) END,
b.ID,b.Station,b.Orders,@l
FROM # a,T_Line b
WHERE a.[Level]=@l-1
AND(a.Station=b.Station AND a.ID<>b.ID
OR a.ID=b.ID AND(
a.Orders=b.Orders+1
OR
a.Orders=b.Orders-1))
AND LEN(a.Line)<4000
AND PATINDEX('%[ >]'+b.Station+'[-)]%',a.Line)=0
END
SELECT N'起点站'=@Station_Start
,N'终点站'=@Station_Stop
,N'乘车线路'=Line+N')'
FROM #
WHERE [Level]=@l
AND Station=@Station_Stop
IF @@ROWCOUNT =0 --如果未有可以到达的线路,则显示处理结果表备查
SELECT * FROM #
GO

--调用
EXEC p_qry N'站A',N'站L'
/*--结果
起点站 终点站 乘车线路
---------- ------------ -----------------------------------------------------------
站A 站L (8路: 站A->站B->站C->站D->站J->站L)
--*/
-狙击手- 2008-01-30
  • 打赏
  • 举报
回复
又是这个问题
blunuser 2008-01-30
  • 打赏
  • 举报
回复
哎!杂都没人帮帮呢
SpringBoot项目基于SpringBoot的公交线路查询系统是一个为城市通勤者设计的在线应用程序,提供实时公交信息和路线规划服务。该系统旨在帮助用户快速找到最佳出行方案,减少等待时间,并提高城市公共交通的效率和便利性。 系统主要功能如下: 1. 实时公交跟踪:用户可以查看公交车的实时位置和预计到站时间,有效规划出行计划。 2. 路线查询与规划:系统提供多条可选路线,根据用户输入的起点和终点智能推荐最优路线。 3. 车辆运行状态:显示公交车的运行状态,包括是否延误、拥挤程度等,以便用户做出选择。 4. 站点信息:提供各个公交站点的具体信息,如附近的地标、可换乘线路等。 5. 历史行程记录:记录用户的查询历史,方便再次使用或参考之前的出行方案。 6. 用户反馈:允许用户报告错误信息或提出建议,以改善系统服务质量。 7. 移动设备兼容:优化移动端访问体验,确保在智能手机或平板电脑上也能良好运行。 8. 数据更新机制:定期更新公交路线和时刻表,确保提供的信息准确可靠。 9. 多语言支持:视需可能提供多种语言选项,服务不同语言背景的用户。 10. 安全性保障:实施合适的安全措施,保护用户数据不被未授权访问。 通过这些功能,基于SpringBoot的公交线路查询系统能够提供一个便捷、可靠的公共交通查询平台,极大提升乘客的出行体验。系统的架构设计注重性能和可用性,以应对高并发的用户访问。其模块化设计也使得未来增加新功能或升级现有功能变得简单快捷,从而保持系统的竞争力。
基于城市、乡镇、县城公交车搜索线路优化管理系统的毕业设计实现 该毕业设计实现了基于城市、乡镇、县城公交车搜索线路优化管理系统。这个系统的目的是解决公交车线路不易查找、线路公交繁忙等问题。该系统基于现有的公交车路线数据,对公交车线路进行搜索和优化,同时提供了公交车线路管理功能,包括添加、修改和删除公交车线路等功能。 该系统可以方便用户查询公交车线路,提供了公交车线路查询、线路优化、线路管理等功能,可以帮助用户更好地选择和规划公交车出行线路。此外,该系统还提供了实时公交车路线查询功能,可以帮助用户了解公交车的实时运行情况,提高了公交车出行的效率。 在该系统中,用户可以通过输入起点和终点,查询最佳公交路线。系统会根据用户的输入,从数据库中检索出所有符合条件的公交车线路,并将它们按照综合评价的得分排序。评价的得分包括以下因素:线路长度、线路上站点的数量、线路上站点的质量、线路的运行频率、车辆的平均速度等。系统会根据这些因素,计算出每个公交路线的得分,并将得分最高的公交路线推荐给用户。 该系统还提供了公交车线路管理功能,管理员可以通过该功能添加、修改和删除公交车线路信息。在添加公交车线路信息时,
该项目是个人高分毕业设计项目源码,已获导师指导认可通过,都经过严格调试,确保可以运行!放心下载使用。 基于微信小程序的公交信息在线查询系统结合了微信小程序前端和SSM(Spring + Spring MVC + MyBatis)框架后端,旨在为用户提供便捷的公交信息查询服务。以下是该系统的主要实现和功能描述: 微信小程序端: 用户可以通过微信小程序进行公交线路查询、站点查询和实时到站信息查询等操作。 提供用户注册和登录功能,用户可以使用微信账号登录或手机号码注册。 支持用户输入起点和终点,查询公交线路和换乘方案,并提供详细的线路信息和站点信息。 用户可以查询特定站点的公交车辆实时到站信息,以便及时抵达车站。 提供公交线路收藏和历史查询记录功能,方便用户快速访问常用线路和查询记录。 后端SSM框架: 使用Spring框架实现了控制反转(IoC)和面向切面编程(AOP),提高了代码的可维护性和可测试性。 利用Spring MVC实现了前端请的分发和处理,将业务逻辑与视图层进行了有效分离,提高了系统的可扩展性。 结合MyBatis框架实现了持久层与数据库的交互,提供了高效、灵活的数据访问方式。 利用Spring事务管理确保了数据库操作的一致性和完整性,保证了系统的稳定性和可靠性。 公交信息查询功能: 用户可以根据起点、终点和时间等条件进行公交线路查询,并获取详细的线路信息和换乘方案。 提供站点查询功能,用户可以查询特定站点的公交线路和到站信息。 实时更新公交车辆位置和到站信息,确保用户获取的信息准确性和实时性。 用户交互和体验优化: 在微信小程序端提供友好的用户界面和交互体验,方便用户快速进行公交信息查询操作。 支持用户个性化设置和偏好管理,如收藏线路、查看历史记录等功能,提高了用户的使用便捷性和满意度。 通过优化查询算法和数据存储结构,提高了查询速度和系统响应性,保证了用户获取公交信息的效率和准确性。 数据安全与隐私保护: 采用加密算法对用户个人信息进行加密存储,确保用户数据的安全性和隐私保护。 严格遵守数据保护法规,保证用户的个人信息和查询记录不被泄露或滥用。 通过以上功能的实现,基于微信小程序的公交信息在线查询系统为用户提供了一个便捷、实用的公交出行信息查询平台,结合SSM框架构建的后端服务保证了系统的稳定性、安全性和可扩展性,为用户提供了快捷、准确的公交信息查询服务。

27,580

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 应用实例
社区管理员
  • 应用实例社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧