SQL 高级查询

yihuiguang 2013-12-04 02:16:46
公交线路(BusRoute)
字段名 字段类型 约束 含义
BRNo NVarhar(4) 主键 公交线路号
Stations Nvarchar(15) 主键 公交站名
Description Nvarchar(100) 公交站描述
请教下如何查询任意两个站之间的线路。。。1路有 A B C D E 2路 D F G H 3路 B H G I K L 等等这些站和路线
我查找要从A 到L的所有路线
简单来说就是查找任意两个已知的公交站的所有公交路线。
还有查询从A到L换乘次数不超过两次的换乘方案;这个怎么写?
学SQL不久请各位不吝指教
...全文
181 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
t101lian 2013-12-05
  • 打赏
  • 举报
回复
看的眼花缭乱。。。
KeepSayingNo 2013-12-04
  • 打赏
  • 举报
回复
请楼主看看我写的这个博文,我这里面的例子是从省到市到区的实现,和你的差不多,只要能知道当前记录关联的记录就好办了 http://blog.csdn.net/dotnetstudio/article/details/10109497
siemens_chang 2013-12-04
  • 打赏
  • 举报
回复
递归查询
Landa_Jimmy 2013-12-04
  • 打赏
  • 举报
回复
if OBJECT_ID('T_Line','u')is not null
drop table T_Line
go
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
 
if object_id('usp_bus_way_line','p')is not null
drop proc usp_bus_way_line
go
--======================================================
--Author:	   Jimmy
--Create Date: 2013-10-11
--Description: 乘车线路查询存储过程
--======================================================
create proc usp_bus_way_line
@Station_Start nvarchar(10),   --起始站
@Station_Stop  nvarchar(10)	   --终点站
as
begin
	-- 关闭返回行计数
	set nocount on
	declare @l int
	set @l=0
	-- 输入起始站为条件,把查询出来的数据插入到临时表中
	select ID,Station,
			--Line主要取值是(id:站名
		   Line=CAST('('+RTRIM(ID)+': '+RTRIM(Station) as nvarchar(4000)),
		   Orders=Orders,
		   [Level]=@l
	into #table from T_Line
	where Station=@Station_Start
	-- 循环直到@@ROWCOUNT>0并且终点站在临时表中不存在
	while @@ROWCOUNT>0 and not exists(select * from #table where Station=@Station_Stop)
	begin
		set @l=@l+1
		--向临时表中插入数据
		insert #table(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 #table 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 #table
	where [Level]=@l AND Station=@Station_Stop
	--如果未有可以到达的线路,则显示处理结果表备查
	if @@ROWCOUNT =0
		select * from #table
end
go
 
--调用
exec usp_bus_way_line N'站A',N'站F'
go

22,209

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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