验证排除编号最低的10个产品的SQL查询语句是否正确
逻辑验证结论
你写的这条SQL逻辑有误,刚好和需求相反,会返回排除了编号最大的10条之外的所有数据,而非你要的排除编号最小的10条。
错误原因说明
你写的子查询逻辑是统计PRODUCT表中,产品编号比当前外层查询的P1.PRODNR更大的记录总数。WHERE 10 < 统计结果的含义是:只有比当前产品编号更大的记录超过10条时,才会返回这条产品编号。
举个简单的例子验证:假设表内产品编号是1到20的连续整数:
- 编号为1的记录,比它大的有19条,满足
10<19的条件,会被返回,但它属于应该被排除的最小10条数据 - 编号为11的记录,比它大的有9条,不满足
10<9的条件,不会被返回,但它属于你需要保留的数据
修复方案
方案1:修改现有SQL的比较逻辑
仅需要把字查询的比较符号调换顺序即可符合需求:
SELECT P1.PRODNR FROM PRODUCT P1 WHERE 10 < (SELECT COUNT(*) FROM PRODUCT P2 WHERE P2.PRODNR < P1.PRODNR)
修改后的子查询统计的是比当前P1.PRODNR更小的产品编号数量,只有这个数量超过10的时候才返回当前编号,也就是当前编号排在第11位及之后,刚好符合你排除最小10条的需求。
方案2:使用更直观高效的通用写法
大部分主流数据库都支持OFFSET分页语法,逻辑更易懂,性能也比关联子查询更好:
SELECT PRODNR FROM PRODUCT ORDER BY PRODNR ASC OFFSET 10 ROWS;
如果使用不支持OFFSET的数据库(如老版本MySQL),也可以用嵌套查询实现:
SELECT PRODNR FROM PRODUCT WHERE PRODNR NOT IN ( SELECT PRODNR FROM PRODUCT ORDER BY PRODNR ASC LIMIT 10 );
注意事项
如果产品编号存在重复值,以上几种写法的处理逻辑会有差异,你可以根据业务对重复值的处理要求调整排名规则即可。
内容的提问来源于stack exchange,提问作者play_something_good
相关产品推荐
相关产品推荐

