基于指定数据库Schema的SQL查询构建与语句纠错请求
解答两个SQL查询问题及代码纠错
1. 查询所有有库存书籍所在的城市名称
要实现这个需求,我们需要关联book、instock和branch三张表,找到所有至少存1本的书籍对应的城市,并用DISTINCT避免重复的城市记录:
SELECT DISTINCT branch.city FROM book INNER JOIN instock ON book.ISBN = instock.ISBN INNER JOIN branch ON instock.libname = branch.libname WHERE instock.quantity >= 1;
逻辑说明:
- 通过
book与instock的关联,筛选出所有有库存的书籍(quantity >=1确保满足“至少存一本”的要求) - 再关联
branch表,获取这些书籍所在分馆的城市 DISTINCT用来去重(同一城市可能有多个分馆存放同一本书,避免重复输出城市名)
2. 查询墨尔本分馆中库存副本数最多的书籍的作者与书名(含代码纠错)
先说说你写的语句里的几个问题:
- 列名错误:
book表中没有author字段,正确的字段名是authorname - 缺少范围筛选:没有限定“墨尔本分馆”的条件,需要关联
branch表并筛选城市为墨尔本 - 逻辑不完整:单纯
GROUP BY无法直接定位到库存最多的书籍,需要借助子查询或窗口函数来获取最大值
根据题目可能的两种歧义(单分馆库存/墨尔本所有分馆总库存),提供两种解决方案:
情况1:墨尔本某一分馆中单本书的库存最多
如果题目指的是墨尔本任意一个分馆里,某本书的库存数量最高:
-- 使用RANK()会保留并列第一的书籍,若只想取其中一本可用ROW_NUMBER() SELECT authorname AS author, title FROM ( SELECT book.authorname, book.title, instock.quantity, RANK() OVER (ORDER BY instock.quantity DESC) AS rank_num FROM book INNER JOIN instock ON book.ISBN = instock.ISBN INNER JOIN branch ON instock.libname = branch.libname WHERE branch.city = '墨尔本' ) AS ranked_books WHERE rank_num = 1;
情况2:墨尔本所有分馆中某本书的总库存最多
如果题目指的是把墨尔本所有分馆的库存加总后,总数量最高的书籍:
SELECT book.authorname AS author, book.title FROM ( SELECT instock.ISBN, SUM(instock.quantity) AS total_stock, RANK() OVER (ORDER BY SUM(instock.quantity) DESC) AS rank_num FROM instock INNER JOIN branch ON instock.libname = branch.libname WHERE branch.city = '墨尔本' GROUP BY instock.ISBN ) AS total_stock_data INNER JOIN book ON total_stock_data.ISBN = book.ISBN WHERE rank_num = 1;
对你原语句的基础修正版:
如果暂时不想用窗口函数,修正后的基础写法如下(仅处理单分馆库存,不支持并列情况):
SELECT book.authorname AS author, book.title FROM book INNER JOIN instock ON book.ISBN = instock.ISBN INNER JOIN branch ON instock.libname = branch.libname WHERE branch.city = '墨尔本' AND instock.quantity = ( SELECT MAX(quantity) FROM instock INNER JOIN branch ON instock.libname = branch.libname WHERE branch.city = '墨尔本' );
内容的提问来源于stack exchange,提问作者Sayed bin Mujaheed
相关产品推荐
相关产品推荐

