递归查询获取数据:解决从Agat出发的可达城市查询报错
解决递归SQL查询的类型匹配错误及正确写法
错误原因
报错ERROR: operator does not exist: integer = character varying的核心问题是数据类型不匹配:Trains表的departure和arrival字段是整数类型(关联Cities表的CID),但原查询中用c.city(字符串类型)和t.arrival做关联,整数与字符串无法直接比较,导致类型兼容错误。
修正后的SQL查询
WITH recursive reachable_cities AS ( -- 初始节点:Agat作为起点,0站停留,同时记录城市ID和名称 SELECT 0 AS stops, c.CID, c.CITY FROM cities c WHERE c.CITY = 'Agat' UNION ALL -- 递归遍历:每次延伸一站,通过城市ID关联火车线路 SELECT r.stops + 1 AS stops, c.CID, c.CITY FROM reachable_cities r INNER JOIN trains t ON r.CID = t.departure INNER JOIN cities c ON t.arrival = c.CID WHERE r.stops < 3 -- 限制最多经过3个中间站 ) -- 去重输出所有可到达的城市 SELECT DISTINCT CITY FROM reachable_cities;
关键修正点
- 递归过程中跟踪
CID(整数类型),用它和Trains表的departure/arrival关联,彻底解决类型不匹配问题 - 用
UNION ALL替代UNION,避免不必要的重复数据检查,提升查询效率 - 最终用
DISTINCT去重,排除多条线路到达同一城市的重复结果 - 条件
r.stops < 3确保查询范围是最多经过3站(包含起点Agat本身,以及经过1、2、3站后到达的所有城市)
内容的提问来源于stack exchange,提问作者Dave
相关产品推荐
相关产品推荐

