帖子里说不清楚,要求用存储过程实现换乘查询。加我QQ:562342,我会发给你数据库,一共两张表,里面有充足的测试数据。50元求高手帮解决
解决方案 »
- sqlserver帮找下错误
- 求一个简单的存储过程~
- sqlite级联删除问题(高分求解)
- 我在一台sql server服務器上注冊另一台sql server服務器出現"不能產生SSPI"的錯誤。
- 80分求一個SQL語句
- 求SQL文(难啊...)
- 怎样往一个表里插入另一个表的内容时手动添加一个字段的内容?
- 安装SQL server 桌面版本的问题
- 好久我没都能解决的难题:用DTS导入/导出功能把excel文件导入Sql Server,发生错误.....请看
- 各视图或函数中的列名必须唯一。在视图或函数 'veb_book_publisher_category' 中多次指定了列名 'publisherId'。
- mysql端口映射问题
- 我这这个sql语句对吗 asp的 数据库是access
不如这里散500分
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-05-22
地点:广东深圳
*//*
数据库中有一张表记录了车号和它经过的站点,
比如:
车号 所经过的站点
1 a,b,c,d,e,f
2 k,n,m,d,l,q,w
3 aa,ee,ww,oo,ef,cc,qw
4 aa,o,p,d,l,q,w,s
如果我现在要查从a到w可以乘做的车次,可以看出要转车,也就是坐1路到d站点,
然后在坐2路或是4路
现在我要写一个存储过程输入两个站点的名称比如a,w要得到 车次1 车次2 转车点
1 2,4 d
也就是先坐1路,再在d站点转2路或4路 请问这个存储过程怎么写
*/create table tb(车号 int,所经过的站点 varchar(50))
insert into tb values(1 , 'a,b,c,d,e,f')
insert into tb values(2 , 'k,n,m,d,l,q,w')
insert into tb values(3 , 'aa,ee,ww,oo,ef,cc,qw')
insert into tb values(4 , 'aa,o,p,d,l,q,w,s')
go
--生成一临时表
SELECT TOP 8000 id = IDENTITY(int, 1, 1) INTO # FROM syscolumns a, syscolumns b declare @s1 as varchar(10)
declare @s2 as varchar(10)
set @s1 = 'a'
set @s2 = 'w'select * from
(
SELECT A.车号 , 站点 = SUBSTRING(A.[所经过的站点], B.id, CHARINDEX(',', A.[所经过的站点] + ',', B.id) - B.id)
FROM tb A, # B
WHERE SUBSTRING(',' + A.[所经过的站点], B.id, 1) = ','
) t
where (站点 = @s2 or 站点 in
(
SELECT 站点 = SUBSTRING(A.[所经过的站点], B.id, CHARINDEX(',', A.[所经过的站点] + ',', B.id) - B.id)
FROM tb A, # B
WHERE SUBSTRING(',' + A.[所经过的站点], B.id, 1) = ','
and 车号 in (select 车号 from tb where charindex(',' + @s1 + ',' , ',' + 所经过的站点 + ',') > 0)
) ) and 车号 not in (select 车号 from tb where charindex(',' + @s1 + ',' , ',' + 所经过的站点 + ',') > 0)
/*
车号 站点
----------- --------------------------------------------------
2 d
2 w
4 d
4 w(所影响的行数为 4 行)
*/-------------------------------------------------------------------------------------------------------------
select 车号 from
(
SELECT A.车号 , 站点 = SUBSTRING(A.[所经过的站点], B.id, CHARINDEX(',', A.[所经过的站点] + ',', B.id) - B.id)
FROM tb A, # B
WHERE SUBSTRING(',' + A.[所经过的站点], B.id, 1) = ','
) t
where (站点 = @s2 or 站点 in
(
SELECT 站点 = SUBSTRING(A.[所经过的站点], B.id, CHARINDEX(',', A.[所经过的站点] + ',', B.id) - B.id)
FROM tb A, # B
WHERE SUBSTRING(',' + A.[所经过的站点], B.id, 1) = ','
and 车号 in (select 车号 from tb where charindex(',' + @s1 + ',' , ',' + 所经过的站点 + ',') > 0)
) ) and 车号 not in (select 车号 from tb where charindex(',' + @s1 + ',' , ',' + 所经过的站点 + ',') > 0)
group by 车号
having count(*) = 2
/*
车号
-----------
2
4(所影响的行数为 2 行)
*/drop table tb , #