SQL查询问题:获取城市间距离语句返回结果不符合预期
问题排查与修正
核心问题分析
你的SQL查询返回多余记录,主要由三个错误导致:
- 字段名不匹配:
cities_distance表中存储城市名的字段是city1和city2,但你写的是name_city1和name_city2,导致表关联条件失效,触发笛卡尔积(所有表记录的交叉组合)。 - 错误的等值条件:
c1.id = c2.id强制要求两个关联城市的ID完全相同,这与查询不同城市间距离的需求矛盾,同时打乱了过滤逻辑。 - 逻辑优先级问题:OR运算符优先级低于AND,导致OR条件未与表关联条件正确绑定,进一步放大了笛卡尔积的影响。
修正后的SQL语句
推荐使用显式JOIN语法(可读性更强),同时修正所有错误:
SELECT c1.name, c2.name, d.distance FROM cities_distance d INNER JOIN city c1 ON c1.name = d.city1 INNER JOIN city c2 ON c2.name = d.city2 WHERE (c1.name, c2.name) IN (('paris', 'berlin'), ('berlin', 'paris'));
或者等价的OR写法:
SELECT c1.name, c2.name, d.distance FROM cities_distance d INNER JOIN city c1 ON c1.name = d.city1 INNER JOIN city c2 ON c2.name = d.city2 WHERE (c1.name = 'paris' AND c2.name = 'berlin') OR (c1.name = 'berlin' AND c2.name = 'paris');
修正说明
- 修正字段名,确保
city表与cities_distance表正确关联,避免无效的笛卡尔积。 - 删除
c1.id = c2.id条件,允许查询不同城市间的距离。 - 使用显式INNER JOIN明确表关系,逻辑更清晰。
- 通过IN条件(或OR)精准匹配巴黎与柏林的两种组合,确保只返回目标记录。
内容的提问来源于stack exchange,提问作者user7867717
相关产品推荐
相关产品推荐

