如何查询存在多个不同馆藏地点的图书?现有HAVING子句失效
问题分析与解决
原SQL语句无法得到正确结果的原因有两个:
- 分组逻辑错误:同时按
book_title和location_code分组,每个分组仅对应单本书的单个馆藏地点,无法统计一本书的总地点数。 - 条件阈值错误:你需要的是「多个馆藏地点」(至少2个),但原语句用了
count(location_code) > 2,即便分组正确,也会漏掉刚好有2个地点的图书。
正确SQL写法
1. 仅获取拥有多个馆藏地点的图书名称
select book_title from books group by book_title having count(distinct location_code) >= 2;
count(distinct location_code):统计每本书对应的不同馆藏地点数量,避免同一地点的多本重复计数。>=2:筛选出地点数量至少为2的图书。
2. 获取图书名称及对应的所有馆藏地点
如果需要同时查看这些图书的具体馆藏地点,可使用以下两种方式:
方法一:子查询关联
select b.book_title, b.location_code from books b inner join ( select book_title from books group by book_title having count(distinct location_code) >= 2 ) as multi_loc_books on b.book_title = multi_loc_books.book_title;
方法二:窗口函数筛选
select book_title, location_code from ( select book_title, location_code, count(distinct location_code) over (partition by book_title) as loc_count from books ) as book_loc_stats where loc_count >= 2;
内容的提问来源于stack exchange,提问作者Yuan
相关产品推荐
相关产品推荐

