如何用SQL查询Sakila数据库inventory表对应行数最少的电影标题
问题原因
你的现有代码存在两个核心错误:
- WHERE子句仅返回了最小计数的数值,没有写比较逻辑,等价于
WHERE [最小计数值],只要该数值不为0就会匹配所有JOIN后的结果,相当于没有筛选条件,完全达不到筛选库存最少电影的效果 - 直接JOIN film和inventory表会返回和库存条目数等量的重复电影标题,没有先按电影维度做聚合去重
正确SQL代码
SELECT f.title FROM film f -- 先关联按film_id聚合的库存计数结果,单部电影仅对应一行,避免重复 INNER JOIN ( SELECT film_id, COUNT(film_id) AS inventory_count FROM inventory GROUP BY film_id ) AS film_inventory ON f.film_id = film_inventory.film_id -- 匹配库存计数等于最小值的电影 WHERE film_inventory.inventory_count = ( SELECT MIN(count_film_id) FROM ( SELECT COUNT(film_id) AS count_film_id FROM inventory GROUP BY film_id ) AS temp_table );
逻辑说明
- 最内层子查询沿用题目给出的参考逻辑,计算所有电影的库存数量最小值
- 中间层子查询先对inventory表按film_id分组,算出每部电影的总库存数,每部电影仅返回一行结果,和film表JOIN时不会产生重复标题
- 最终WHERE条件将每部电影的库存数和最小值做相等匹配,即可返回所有库存最少的唯一电影标题
内容的提问来源于stack exchange,提问作者tpace4
相关产品推荐
相关产品推荐

