SQL查询:仅返回含1行明细的订单 过滤多行明细订单记录
解决方案
方案1:窗口函数实现(适用MySQL8.0+/PostgreSQL/Oracle等支持窗口函数的数据库)
该写法逻辑直观,仅需一次表扫描性能更好:
SELECT order_no, line_no FROM ( SELECT order_no, line_no, -- 按订单号分组统计每个订单的总明细行数 COUNT(*) OVER (PARTITION BY order_no) AS total_line FROM customer_order_line -- 如需筛选包含指定商品的订单,在此处添加商品过滤条件,例:WHERE goods_id = '指定商品ID' WHERE order_no IN('9891026','9891025') ) t WHERE total_line = 1;
方案2:分组子查询实现(兼容所有数据库版本,包括低版本MySQL)
通过子查询先筛选出明细行数恰好为1的订单号,再关联查询明细:
SELECT order_no, line_no FROM customer_order_line WHERE order_no IN ( SELECT order_no FROM customer_order_line -- 如需筛选包含指定商品的订单,在此处添加商品过滤条件 WHERE order_no IN('9891026','9891025') GROUP BY order_no HAVING COUNT(*) = 1 );
执行结果
两种写法在你的测试场景下都会返回期望的结果:
| order_no | line_no |
|---|---|
| 9891025 | 1 |
内容的提问来源于stack exchange,提问作者Jimmy Olsson
相关产品推荐
相关产品推荐

