You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SQL查询问题:获取城市间距离语句返回结果不符合预期

问题排查与修正

核心问题分析

你的SQL查询返回多余记录,主要由三个错误导致:

  1. 字段名不匹配:cities_distance表中存储城市名的字段是city1和city2,但你写的是name_city1和name_city2,导致表关联条件失效,触发笛卡尔积(所有表记录的交叉组合)。
  2. 错误的等值条件:c1.id = c2.id强制要求两个关联城市的ID完全相同,这与查询不同城市间距离的需求矛盾,同时打乱了过滤逻辑。
  3. 逻辑优先级问题: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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 18:15:41