如何筛选仅使用Cash支付的Order_id?SQL查询问题求助
解决仅筛选使用Cash支付的订单ID问题
你的问题出在原SQL的逻辑上:WHERE (payment_type = 'Cash' and payment_type <> 'Check')只是筛选出当前行是Cash的记录,但订单3346里存在Cash类型的行,所以这些行会被返回,导致订单ID 3346出现在结果里——但实际上这个订单还有Check支付,不符合你的需求。
下面是几种正确的查询方法:
方法1:使用GROUP BY + HAVING(最直观的方式)
通过分组统计每个订单的支付类型,确保只有一种支付方式且为Cash:
SELECT order_id FROM orders GROUP BY order_id HAVING COUNT(DISTINCT payment_type) = 1 AND MAX(payment_type) = 'Cash';
COUNT(DISTINCT payment_type) = 1:确保该订单只有唯一一种支付方式MAX(payment_type) = 'Cash':因为只有一种支付方式,MAX/MIN都能拿到这个值,确认是Cash
方法2:使用NOT EXISTS(性能友好的方式)
先找到所有有Cash支付的订单,再排除掉那些存在其他支付方式的订单:
SELECT DISTINCT o.order_id FROM orders o WHERE o.payment_type = 'Cash' AND NOT EXISTS ( SELECT 1 FROM orders o2 WHERE o2.order_id = o.order_id AND o2.payment_type != 'Cash' );
NOT EXISTS子查询会检查同一个订单是否存在非Cash的支付记录,如果存在就排除该订单DISTINCT用来去重,因为一个订单可能有多个Cash商品行
方法3:使用EXCEPT(语法简洁,需数据库支持)
如果你的数据库支持EXCEPT(比如PostgreSQL、SQL Server),可以用集合差集实现:
SELECT order_id FROM orders WHERE payment_type = 'Cash' EXCEPT SELECT order_id FROM orders WHERE payment_type != 'Cash';
- 先获取所有有Cash支付的订单ID,再减去有非Cash支付的订单ID,剩下的就是仅用Cash的订单
内容的提问来源于stack exchange,提问作者Radhika
相关产品推荐
相关产品推荐

