SQL查询的问题 起点 终点 交叉 自己查找

binbinxxxx 2007-03-24 08:39:25
有一个[线路表],如下

线路 起点 终点
11路 火车站 建设路
22路 建设路 火车站
.... ...... ........


要得到一个 起终点->线路 的查询结果

起点 终点 线路
火车站 建设路 11路,22路
... .... .. ...

这个查询怎么写?
在Access 或者SQL server
...全文
358 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
缪军 2007-03-27
  • 打赏
  • 举报
回复
select distinct 起点,终点 into #tbl from 线路表 a where isnull((select count(1) from 线路表 b where b.id>a.id and
b.起点=a.终点 and b.终点=a.起点),0)<2
--select * from #tbl
select [ID] = identity(bigint,1,1),
起点,终点,线路=REPLICATE(' ',255)
into #tbl2
from #tbl


DECLARE @_Line NVARCHAR(255)

DECLARE @_i BIGINT
SET @_i = 1
DECLARE @_j BIGINT
SET @_j = 1
while @_i<=(SELECT COUNT(1) FROM #tbl2)
BEGIN
SET @_j = 1
SET @_Line = ''
WHILE @_j <=(SELECT COUNT(1) FROM 线路表)
BEGIN
SET @_Line = @_Line + ISNULL(( SELECT CASE @_Line
WHEN '' THEN ''
ELSE ','
END
+线路 FROM 线路表
WHERE [ID] = @_j AND (
(
线路表.起点 = (SELECT 起点 FROM #tbl2 WHERE [ID]=@_i)
AND 线路表.终点 = (SELECT 终点 FROM #tbl2 WHERE [ID]=@_i)
)
OR
(
线路表.起点 = (SELECT 终点 FROM #tbl2 WHERE [ID]=@_i)
AND 线路表.终点 = (SELECT 起点 FROM #tbl2 WHERE [ID]=@_i)
)
)
),'')
print @_Line
SET @_j = @_j + 1
END
UPDATE #tbl2 SET 线路 = @_Line WHERE [ID]=@_i
SET @_i=@_i+1
END
SELECT * FROM #tbl2
drop table #tbl
drop table #tbl2
缪军 2007-03-27
  • 打赏
  • 举报
回复
你早说阿,呵呵,需求没有描述清楚,我以为只是配对呢
这么复杂
这个光用一条SELECT是无法完成的,我在查询分析器当中调试通过了
你自己放到存储过程里吧
binbinxxxx 2007-03-26
  • 打赏
  • 举报
回复
我改成MSSqlServer后有两个问题

表如下

1 11路 火车站 建设路
2 22路 建设路 火车站
3 33路 火车站 人民路
4 44路 建设路 火车站

问题1:增加了记录4后,SQL语句出错,提示 “子查询返回的值不止一个”。它的确返回的值不止一个,那怎么写呢?
问题2:增加了记录3后,因为只有一条唯一的记录,上述SQL不能返回 火车站 人民路 33路

再次多谢 microtry(米醋)
缪军 2007-03-26
  • 打赏
  • 举报
回复
当 Variant 为 Null 时,可以使用 Nz 函数返回零、零长度字符串 (" ") 或其他指定的值。例如,您可以使用该函数将 Null 值转换为其他值,以避免该值在表达式中传播。

Nz(variant, [valueifnull])
Nz 函数具有下列参数。

参数 说明
variant 数据类型为 Variant 的变量。
valueifnull 可选(除非是用在查询中)。Variant 型,如果 variant 参数为 Null,此参数提供要返回的值。使用此参数,可以返回一个非零或零长度字符串的值。
注释 如果在查询中的表达式中使用 Nz 函数,而没有使用 valueifnull 参数,将在包含 null 值的字段中生成一个零长度的字符串。

缪军 2007-03-26
  • 打赏
  • 举报
回复
我用的是MSSqlServer
楼主是在Access中做的吧,
那您有没有把ISNULL()改为NZ()啊
binbinxxxx 2007-03-24
  • 打赏
  • 举报
回复
非常感谢microtry(米醋)
我修改了一下

SELECT a.起点, a.终点, a.线路 = a.线路 + ',' +
(SELECT b.线路
FROM 线路表 b
WHERE b.起点= a.终点 AND b.终点 = a.起点 and b.id> a.id)
FROM 线路表 AS a
WHERE isnull(a.线路 + ',' +
(SELECT b.线路
FROM 线路表 b
WHERE b.起点= a.终点 AND b.终点 = a.起点 and b.id> a.id));

发现有些问题

[线路表]中的内容

ID 线路 起点 终点
1 11路 火车站 建设路
2 22路 建设路 火车站
3 33路 火车站 建设路
4 44路 人民路 火车站
5 55路 人民路 建设路

字段的定义为
ID AutoNumber
线路 Text
起点 Text
终点 Text

得到的结果是

起点 终点 Expr1002
火车站 建设路
人民路 火车站
人民路 建设路

在Expr1002 字段 和 结果都没有对
缪军 2007-03-24
  • 打赏
  • 举报
回复
先给表增加标识字段id(identity,1,1)

SELECT 起点, 终点, 线路 =线路+ ',' +
(SELECT 线路
FROM 线路表 b
WHERE b.起点= a.终点 AND b.终点 = a.起点 and b.id> a.id)
FROM 线路表 a
where isnull(线路+ ',' +
(SELECT 线路
FROM 线路表 b
WHERE b.起点= a.终点 AND b.终点 = a.起点 and b.id> a.id),'')<>''

7,714

社区成员

发帖
与我相关
我的任务
社区描述
Microsoft Office Access是由微软发布的关系数据库管理系统。它结合了 MicrosoftJet Database Engine 和 图形用户界面两项特点。
社区管理员
  • Access
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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