[SQL]公交新路问题
--解答一
CREATE TABLE T_Line(
ID nvarchar(), --公交线路号
Station nvarchar(), --站点名称
Orders int) --行车方向(通过它反应每个站的上一个、下一个站)
INSERT T_Line
SELECT N'8路' ,N'站A', UNION ALL
SELECT N'8路' ,N'站B', UNION ALL
SELECT N'8路' ,N'站C', UNION ALL
SELECT N'8路' ,N'站D', UNION ALL
SELECT N'8路' ,N'站J', UNION ALL
SELECT N'8路' ,N'站L', UNION ALL
SELECT N'8路' ,N'站M', UNION ALL
SELECT N'20路' ,N'站G', UNION ALL
SELECT N'20路' ,N'站H', UNION ALL
SELECT N'20路' ,N'站I', UNION ALL
SELECT N'20路' ,N'站J', UNION ALL
SELECT N'20路' ,N'站L', UNION ALL
SELECT N'20路' ,N'站M', UNION ALL
SELECT N'255路',N'站N', UNION ALL
SELECT N'255路',N'站O', UNION ALL
SELECT N'255路',N'站P', UNION ALL
SELECT N'255路',N'站Q', UNION ALL
SELECT N'255路',N'站J', UNION ALL
SELECT N'255路',N'站D', UNION ALL
SELECT N'255路',N'站E', UNION ALL
SELECT N'255路',N'站F',
GO --乘车线路查询存储过程
CREATE PROC p_qry
@Station_Start nvarchar(),
@Station_Stop nvarchar()
AS
SET NOCOUNT ON
DECLARE @l int
SET @l=
SELECT ID,Station,
Line=CAST('('+RTRIM(ID)+': '+RTRIM(Station) as nvarchar()),
Orders=Orders,
[Level]=@l
INTO # FROM T_Line
WHERE Station=@Station_Start
WHILE @@ROWCOUNT>
AND NOT EXISTS(SELECT * FROM # WHERE Station=@Station_Stop)
BEGIN
SET @l=@l+
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-
AND(a.Station=b.Station AND a.ID<>b.ID
OR a.ID=b.ID AND(
a.Orders=b.Orders+
OR
a.Orders=b.Orders-))
AND LEN(a.Line)<
AND PATINDEX('%[ >]'+b.Station+'[-)]%',a.Line)=
END
SELECT N'起点站'=@Station_Start
,N'终点站'=@Station_Stop
,N'乘车线路'=Line+N')'
FROM #
WHERE [Level]=@l
AND Station=@Station_Stop
IF @@ROWCOUNT = --如果未有可以到达的线路,则显示处理结果表备查
SELECT * FROM #
GO --调用
EXEC p_qry N'站A',N'站L'
drop table T_Line
drop procedure p_qry
/*--结果
起点站 终点站 乘车线路
---------- ------------ -----------------------------------------------------------
站A 站L (8路: 站A->站B->站C->站D->站J->站L)
--*/ --解答二
CREATE TABLE T_Line(busID nvarchar(),stationID nvarchar(),staTionName nvarchar(),stationSort int)
INSERT T_Line
SELECT N'B0280017',N'S0280030',N'荷花池', UNION ALL
SELECT N'B0280017',N'S0280028',N'火车北站', UNION ALL
SELECT N'B0280017',N'S0280289',N'二环北二段', UNION ALL
SELECT N'B0280018',N'S0280011',N'人名北路', UNION ALL
SELECT N'B0280018',N'S0280028',N'火车北站', UNION ALL
SELECT N'B0280018',N'S0280213',N'五块石', UNION ALL
SELECT N'B0280019',N'S0280013',N'五块石', UNION ALL
SELECT N'B0280019',N'S0280014',N'二环路东二段', UNION ALL
SELECT N'B0280019',N'S0280215',N'二环东三段',
GO --乘车线路查询存储过程
CREATE PROC p_qry
@Station_Start nvarchar(),
@Station_Stop nvarchar()
AS
SET NOCOUNT ON
DECLARE @l int
SET @l=
SELECT busID,staTionName,
Line=CAST('('+RTRIM(busID)+': '+RTRIM(staTionName) as nvarchar()),
stationSort=stationSort,
[Level]=@l
INTO # FROM T_Line
WHERE staTionName=@Station_Start
WHILE @@ROWCOUNT>
AND NOT EXISTS(SELECT * FROM # WHERE staTionName=@Station_Stop)
BEGIN
SET @l=@l+
INSERT #(Line,busID,staTionName,stationSort,[Level])
SELECT
Line=a.Line+CASE
WHEN a.busID=b.busID THEN N'->'+RTRIM(b.staTionName)
ELSE N') ∝ ('+RTRIM(b.busID)
+N': '+RTRIM(b.staTionName) END,
b.busID,b.staTionName,b.stationSort,@l
FROM # a,T_Line b
WHERE a.[Level]=@l-
AND(a.staTionName=b.staTionName AND a.busID<>b.busID
OR a.busID=b.busID AND(
a.stationSort=b.stationSort+
OR
a.stationSort=b.stationSort-))
AND LEN(a.Line)<
AND PATINDEX('%[ >]'+b.staTionName+'[-)]%',a.Line)=
END
SELECT N'起点站'=@Station_Start
,N'终点站'=@Station_Stop
,N'乘车线路'=Line+N')'
FROM #
WHERE [Level]=@l
AND staTionName=@Station_Stop
IF @@ROWCOUNT = --如果未有可以到达的线路,则显示处理结果表备查
SELECT * FROM #
GO --调用
EXEC p_qry N'荷花池',N'二环东三段' drop proc p_qry ----删除存储过程
drop table T_Line ----删除表 /* 结果 起点站 终点站 乘车线路
*/ --解答三
CREATE TABLE T_Line(busID nvarchar(),stationID nvarchar(),staTionName nvarchar(),stationSort int)
INSERT T_Line
SELECT N'B0280017',N'S0280030',N'荷花池', UNION ALL
SELECT N'B0280017',N'S0280028',N'火车北站', UNION ALL
SELECT N'B0280017',N'S0280289',N'二环北二段', UNION ALL
SELECT N'B0280018',N'S0280011',N'人名北路', UNION ALL
SELECT N'B0280018',N'S0280028',N'火车北站', UNION ALL
SELECT N'B0280018',N'S0280213',N'五块石', UNION ALL
SELECT N'B0280019',N'S0280013',N'五块石', UNION ALL
SELECT N'B0280019',N'S0280014',N'二环路东二段', UNION ALL
SELECT N'B0280019',N'S0280215',N'二环东三段',
GO --乘车线路查询存储过程
CREATE PROC p_qry
@Station_Start nvarchar(),
@Station_Stop nvarchar()
AS
SET NOCOUNT ON
DECLARE @l int
SET @l=
SELECT busID,staTionName,
Line=CAST('('+RTRIM(busID)+': '+RTRIM(staTionName) as nvarchar()),
stationSort=stationSort,
[Level]=@l
INTO # FROM T_Line
WHERE staTionName=@Station_Start
WHILE @@ROWCOUNT>
AND NOT EXISTS(SELECT * FROM # WHERE staTionName=@Station_Stop)
BEGIN
SET @l=@l+
INSERT #(Line,busID,staTionName,stationSort,[Level])
SELECT
Line=a.Line+CASE
WHEN a.busID=b.busID THEN N'->'+RTRIM(b.staTionName)
ELSE N') ∝ ('+RTRIM(b.busID)
+N': '+RTRIM(b.staTionName) END,
b.busID,b.staTionName,b.stationSort,@l
FROM # a,T_Line b
WHERE a.[Level]=@l-
AND(a.staTionName=b.staTionName AND a.busID<>b.busID
OR a.busID=b.busID AND(
a.stationSort=b.stationSort+
OR
a.stationSort=b.stationSort-))
AND LEN(a.Line)<
AND PATINDEX('%[ >]'+b.staTionName+'[-)]%',a.Line)=
END
SELECT N'起点站'=@Station_Start
,N'终点站'=@Station_Stop
,N'乘车线路'=Line+N')'
FROM #
WHERE [Level]=@l
AND staTionName=@Station_Stop
IF @@ROWCOUNT = --如果未有可以到达的线路,则显示处理结果表备查
SELECT * FROM #
GO --调用
EXEC p_qry N'荷花池',N'二环东三段' drop proc p_qry
drop table T_Line /* 结果 起点站 终点站 乘车线路
---------- ---------- ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
荷花池 二环东三段 (B0280017: 荷花池->火车北站) ∝ (B0280018: 火车北站->五块石) ∝ (B0280019: 五块石->二环路东二段->二环东三段) */
[SQL]公交新路问题的更多相关文章
- 谈谈我的微软特约稿:《SQL Server 2014 新特性:IO资源调控》
一.本文所涉及的内容(Contents) 本文所涉及的内容(Contents) 背景(Contexts) 撰写经历(Experience) 特约稿正文(Content-body) 第一部分:生活中资源 ...
- sql server中自连接的使用
一.用SQL自连接查询处理列之间的关系 SQL自身连接,可以解决很多问题.下面举的一个例子,就是使用了SQL自身连接,它解决了列与列之间的逻辑关系问题,准确的讲是列与列之间的层次关系.SQL代码如下: ...
- 自从学了SQL编程,哪里不会点哪里!!!
在学习SQL编程前,先给大家分享几个段子吧,咱先乐呵乐呵! <桃花庵--程序员版> 写字楼里写字间,写字间中程序员:程序人员写程序,又将程序换酒钱: 酒醒只在屏前坐,酒醉还来屏下眠:酒醉酒 ...
- 在SQL Server实现最短路径的搜索
开始 这是去年的问题了,今天在整理邮件的时候才发现这个问题,感觉顶有意思的,特记录下来. 在表RelationGraph中,有三个字段(ID,Node,RelatedNode),其中Node和Rela ...
- SQL Server 2014 新特性:IO资源调控
谈谈我的微软特约稿:<SQL Server 2014 新特性:IO资源调控> 2014-07-01 10:19 by 听风吹雨, 570 阅读, 16 评论, 收藏, 收藏 一.本文所涉及 ...
- [原创] 思维导图笔记(二):SQL
为了补一补知识体系上的缺漏,最近找了看完了Ben Forta写的<Sams Teach Yourself SQL in 10 Minutes>,翻译过来叫<SQL必知必会>.从 ...
- C#构造方法(函数) C#方法重载 C#字段和属性 MUI实现上拉加载和下拉刷新 SVN常用功能介绍(二) SVN常用功能介绍(一) ASP.NET常用内置对象之——Server sql server——子查询 C#接口 字符串的本质 AJAX原生JavaScript写法
C#构造方法(函数) 一.概括 1.通常创建一个对象的方法如图: 通过 Student tom = new Student(); 创建tom对象,这种创建实例的形式被称为构造方法. 简述:用来初 ...
- sql中自连接的使用
一.用SQL自连接查询处理列之间的关系 SQL自身连接,可以解决很多问题.下面举的一个例子,就是使用了SQL自身连接,它解决了列与列之间的逻辑关系问题,准确的讲是列与列之间的层次关系.SQL代码如下: ...
- ES SQL使用说明文档
ES SQL使用说明文档 一.Elasticsearch术语介绍 l 接近实时(NRT): Elasticsearch 是一个接近实时的搜索平台.这意味着,从索引一个文档直到这个文档能够被搜索到有一 ...
随机推荐
- C语言的几种取整方法
C语言的几种取整方法 来源:http://blog.sina.com.cn/s/blog_4c0cb1c001013ha9.html 1.直接赋值给整数变量.如: int i = 2.5; 或 i = ...
- HTML5鼠标hover的时候图片放大的效果展示
<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...
- mysql初学
本文基于mysql5.1编写 1.创建表: ) ),age ) '); 2.删除表: drop table customer; 3.部分列插入元素: insert into customer(mid, ...
- Python文件处理之文件写入方式与写缓存(三)
Python的open的写入方式有: write(str):将str写入文件 writelines(sequence of strings):写多行到文件,参数为可迭代对象 首先来看下writelin ...
- SQL SERVER 生成ORACLE建表脚本
/****** Object: StoredProcedure [dbo].[GET_TableScript_ORACLE] Script Date: 06/15/2012 13:07:16 **** ...
- php 同步因子的并发处理
在php中,如果处理支付时,会涉及到并发. 具体体现在同步通知支付结果和异步通知结果. 拿支付宝来说,同步通知call_back和异步通知notify是没有固定先后顺序的. 有可能notify先通知到 ...
- Java compiler level does not match the version of the installed Java project facet.问题
从同事那里拷贝过来的web项目,导入到eclipse中,出现Java compiler level does not match the version of the installed Java p ...
- C++工程编译之“error LNK2001: 无法解析的外部符号”
今天一整天都在折腾“error LNK2001: 无法解析的外部符号”,就在头疼不已的时候,总算是找到问题原因了:各个动态链接库的编译方式必须统一才行,要不然很容易对库函数的引用产生冲突.简单来说就是 ...
- 正则表达式(BREs,EREs,PREs)差异比较
我想各位也和我一样,再linux下使用grep,egrep, awk , sed, vi的搜索时,会经常搞不太清楚,哪此特殊字符得使用转义字符'\' .. 哪些不需要, grep与egrep的差异 ...
- 删除SQL server 实例
在网上找到下面几种方法,本人使用的是第一种,很实用. 1.删除 SQL Server 的特定实例若要删除 SQL Server 的某个特定实例,请按照以下步骤操作: 找到并删除%drive%:\\Pr ...