如何统计外键数量并用于筛选排序主表?Oracle SQL查询问题
问题排查与解决方案
现有SQL错误点
- 别名错误:内连接关联的是
Vendor表,但ON条件中写了未定义的vend别名,触发invalid identifier报错 - 聚合函数使用位置错误:
COUNT(*)属于聚合函数,不能放在WHERE子句中做筛选,聚合结果的过滤需要用HAVING子句,触发group function is not allowed here报错 - GROUP BY字段不匹配:Oracle要求SELECT子句中的非聚合字段必须全部出现在GROUP BY子句中,现有写法中SELECT的
Vendor.vend_id没有在GROUP BY中声明,也会触发报错
正确查询语句
两种写法都可以实现需求:
写法1:先统计产品表供应商供货数再关联供应商表(性能更优,先过滤再关联)
SELECT v.vend_name FROM Vendor v INNER JOIN ( SELECT vend_id FROM Product GROUP BY vend_id HAVING COUNT(prod_id) = 1 ) p ON v.vend_id = p.vend_id;
写法2:关联后直接分组筛选
SELECT v.vend_name FROM Product p INNER JOIN Vendor v ON p.vend_id = v.vend_id GROUP BY v.vend_id, v.vend_name HAVING COUNT(p.prod_id) = 1;
说明:两种写法都用
COUNT(prod_id)而不是COUNT(*),避免Product表存在prod_id为空的脏数据时统计结果出错,和「统计供应产品数」的需求逻辑完全匹配。
内容的提问来源于stack exchange,提问作者dyertkd
相关产品推荐
相关产品推荐

