查询指定月份乘机次数超5次的乘客信息,现有SQL执行结果不符合预期
SQL语句问题排查与修正
原有语句错误原因
HAVING子句必须配合GROUP BY分组语句使用才能实现按单用户统计乘机次数,未分组的情况下count(pass_id)会直接统计所有符合筛选条件的记录总条数,无法判断单个用户的乘机次数是否达标。- 内层子查询仅筛选出了10月有乘机记录的乘客ID,没有做次数统计,外层逻辑无法拿到单用户的乘机次数数据。
正确实现写法
写法1:子查询过滤符合条件的乘客ID
SELECT * FROM passengers WHERE pass_id IN ( SELECT pass_id FROM flights WHERE f_date BETWEEN '2020-10-01' AND '2020-10-31' GROUP BY pass_id HAVING COUNT(*) > 5 );
写法2:关联查询(数据量较大时性能更优)
SELECT p.* FROM passengers p INNER JOIN ( SELECT pass_id FROM flights WHERE f_date BETWEEN '2020-10-01' AND '2020-10-31' GROUP BY pass_id HAVING COUNT(*) > 5 ) f ON p.pass_id = f.pass_id;
额外提示
日期参数建议写全两位的日/月数值,'2020-10-01' 比 '2020-10-1' 在不同数据库中的兼容性更好,避免出现日期识别异常。
内容的提问来源于stack exchange,提问作者Citric101
相关产品推荐
相关产品推荐

