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) --*/给个例子
把or改成and还是不行 后台数据库是access 如何改sql语句呢?
where 后面,不是OR,而是用AND 逻辑问题
你的数据库中一定得对线路的起点和终点进行标记,否则是查不出来的,你想,用一个站点,怎么能标度两个站点呢? 如果数据库是这样: busid,busname,station1,station2 则: sql="select * from [bus] where ([station1] like '%"&station1&"%' and [station2] like '%"&station2&"%') and ([station2] like '%"&station1&"%' and [station1] like '%"&station2&"%')"
也跟着犯错了! sql="select * from [bus] where ([station1] like '%"&station1&"%' and [station2] like '%"&station2&"%') or ([station2] like '%"&station1&"%' and [station1] like '%"&station2&"%')"
declare @tb table(id int,[station] nvarchar(1000))insert @tb select 1,'车辆厂文化宫→高谊街→道里十二道街→哈尔滨商厦→金太阳精品城→南马路→承德广场→靖宇头道街→靖宇七道街→靖宇十二道街→靖宇十六道街→靖宇二十道街→毛织厂→造纸厂→油石厂→木材厂→港务局' union all select 2,'黎华小区→太古二十道街→太古十六道街→玛克威→靖宇十二道街→靖宇七道街→靖宇头道街→承德广场→南平街→南马路→买卖街→兆麟街(哈尔滨联升广场)→建筑艺术广场→哈站→博物馆→工人文化宫→文昌街→省政府→亚麻厂→和平桥→省中医药大学→三大动力路→哈平路→花卉市场→植物园→远大都市绿洲(林科院)→肿瘤医院 'union all select 3,'经纬十一道街→经纬街→上游街→中央大街→兆麟公园→兆麟街(哈尔滨联升广场)→买卖街→南马路→南平街→烟厂→哈工程大学→南通大街→太平桥→先锋路→省药材公司→南直商场→桦树街→网通东直路营业厅→道外公安分局→太平桥→南通大街→哈工程大学→烟厂→南平街→南马路→买卖街→兆麟街(哈尔滨联升广场)→兆麟公园→中央大街→红霞街(临时站)→经纬街→经纬十一道街'union all select 4,'顾乡-康安路-省化工研究院-中心医院-安和街-安升街-北安街-哈一百-兆麟街(哈尔滨联升广场)-买卖街-南马路-南平街-南极街-新发小区-宽城街-宣化街(先锋路路口)-先锋小区-嵩山小区-辽河小区-淮河路-红旗小区'--方法一 select * from @tb where charindex('南马路',[station])>0 INTERSECT select * from @tb where charindex('油石厂',[station])>0 --方法二 select * from @tb where [station] like '%南马路%' AND [station] LIKE '%油石厂%'--方法三 select * from @tb where charindex('南马路',[station])>0 AND charindex('油石厂',[station])>0 /* id station ----------- ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- 1 车辆厂文化宫→高谊街→道里十二道街→哈尔滨商厦→金太阳精品城→南马路→承德广场→靖宇头道街→靖宇七道街→靖宇十二道街→靖宇十六道街→靖宇二十道街→毛织厂→造纸厂→油石厂→木材厂→港务局 */
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)
--*/给个例子
逻辑问题
如果数据库是这样:
busid,busname,station1,station2
则:
sql="select * from [bus] where ([station1] like '%"&station1&"%' and [station2] like '%"&station2&"%') and ([station2] like '%"&station1&"%' and [station1] like '%"&station2&"%')"
sql="select * from [bus] where ([station1] like '%"&station1&"%' and [station2] like '%"&station2&"%') or ([station2] like '%"&station1&"%' and [station1] like '%"&station2&"%')"
select 1,'车辆厂文化宫→高谊街→道里十二道街→哈尔滨商厦→金太阳精品城→南马路→承德广场→靖宇头道街→靖宇七道街→靖宇十二道街→靖宇十六道街→靖宇二十道街→毛织厂→造纸厂→油石厂→木材厂→港务局' union all
select 2,'黎华小区→太古二十道街→太古十六道街→玛克威→靖宇十二道街→靖宇七道街→靖宇头道街→承德广场→南平街→南马路→买卖街→兆麟街(哈尔滨联升广场)→建筑艺术广场→哈站→博物馆→工人文化宫→文昌街→省政府→亚麻厂→和平桥→省中医药大学→三大动力路→哈平路→花卉市场→植物园→远大都市绿洲(林科院)→肿瘤医院 'union all
select 3,'经纬十一道街→经纬街→上游街→中央大街→兆麟公园→兆麟街(哈尔滨联升广场)→买卖街→南马路→南平街→烟厂→哈工程大学→南通大街→太平桥→先锋路→省药材公司→南直商场→桦树街→网通东直路营业厅→道外公安分局→太平桥→南通大街→哈工程大学→烟厂→南平街→南马路→买卖街→兆麟街(哈尔滨联升广场)→兆麟公园→中央大街→红霞街(临时站)→经纬街→经纬十一道街'union all
select 4,'顾乡-康安路-省化工研究院-中心医院-安和街-安升街-北安街-哈一百-兆麟街(哈尔滨联升广场)-买卖街-南马路-南平街-南极街-新发小区-宽城街-宣化街(先锋路路口)-先锋小区-嵩山小区-辽河小区-淮河路-红旗小区'--方法一
select * from @tb where charindex('南马路',[station])>0
INTERSECT
select * from @tb where charindex('油石厂',[station])>0 --方法二
select * from @tb where [station] like '%南马路%' AND [station] LIKE '%油石厂%'--方法三
select * from @tb where charindex('南马路',[station])>0 AND charindex('油石厂',[station])>0 /*
id station
----------- ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
1 车辆厂文化宫→高谊街→道里十二道街→哈尔滨商厦→金太阳精品城→南马路→承德广场→靖宇头道街→靖宇七道街→靖宇十二道街→靖宇十六道街→靖宇二十道街→毛织厂→造纸厂→油石厂→木材厂→港务局
*/