Oracle环境下查询借阅量最高的单本及多本图书的SQL方案
嘿,我来帮你搞定这两个Oracle SQL查询需求,先把两种语言的表结构对应清楚,再一步步给出解决方案~
表结构对应
西班牙语表结构
Socio(codigo, apellido_nombre, direccion, telefono, fecha_alt) Libro(codigo, titulo_libro, tema) Prestamos(codigoSocio, codigoLibro)
英语表结构
Member(code, last_name, first_name, address, telephone, date_alt) Book(code, title_book, subject) Loans(codeMember, codeBook)
SQL解决方案
下面针对英语表结构(Loans表)给出查询,西语版本只需要把Loans换成Prestamos,codeBook换成codigoLibro即可,我会在每个方案后提一下西语的替换方式。
1. 查询借阅量最高的所有图书(1本及以上,含并列)
你提供的基础SQL已经完成了分组和排序,但还没筛选出借阅量最高的那些。这里有两种常用实现方式:
方式一:使用窗口函数(推荐,简洁高效)
利用Oracle的RANK()窗口函数,直接标记出借阅量排名第一的图书,并列的会被同时选中:
SELECT codeBook, borrow_count FROM ( SELECT codeBook, COUNT(*) AS borrow_count, RANK() OVER (ORDER BY COUNT(*) DESC) AS rnk FROM Loans GROUP BY codeBook ) WHERE rnk = 1;
西语版本替换:把Loans改为Prestamos,codeBook改为codigoLibro,borrow_count可以换成prestamo_count便于理解
方式二:子查询嵌套
先计算所有图书的借阅量,再找出最大值,最后筛选借阅量等于最大值的图书:
SELECT codeBook, COUNT(*) AS borrow_count FROM Loans GROUP BY codeBook HAVING COUNT(*) = ( SELECT MAX(borrow_num) FROM ( SELECT COUNT(*) AS borrow_num FROM Loans GROUP BY codeBook ) );
西语版本替换规则同上
2. 查询借阅量最高的单本图书(仅返回1本,即使有并列)
如果只需要返回其中一本(不管有没有并列),可以根据Oracle版本选择不同写法:
方式一:Oracle 12c及以上版本(简洁写法)
使用FETCH FIRST 1 ROW ONLY直接获取排序后的第一行:
SELECT codeBook, COUNT(*) AS borrow_count FROM Loans GROUP BY codeBook ORDER BY COUNT(*) DESC FETCH FIRST 1 ROW ONLY;
方式二:低版本Oracle(兼容写法)
通过子查询排序后,用ROWNUM筛选第一行:
SELECT codeBook, borrow_count FROM ( SELECT codeBook, COUNT(*) AS borrow_count FROM Loans GROUP BY codeBook ORDER BY COUNT(*) DESC ) WHERE ROWNUM = 1;
西语版本替换规则同上
内容的提问来源于stack exchange,提问作者wallcroft
相关产品推荐
相关产品推荐

