查询同时存在客户与访客订单的邮箱SQL解决方案
解决方案:找出同时存在访客与客户订单的邮箱
方法1:GROUP BY 结合 HAVING 条件筛选
这是最直接的实现方式,通过按邮箱分组后,检查该分组是否同时包含访客订单(CustID=0)和客户订单(CustID≠0):
SELECT Email FROM tblOrders GROUP BY Email HAVING SUM(CASE WHEN CustID = 0 THEN 1 ELSE 0 END) > 0 AND SUM(CASE WHEN CustID != 0 THEN 1 ELSE 0 END) > 0;
也可以用更简洁的逻辑,通过判断分组内CustID的范围来实现:
SELECT Email FROM tblOrders GROUP BY Email HAVING MIN(CustID) = 0 AND MAX(CustID) > 0;
这个写法的逻辑是:如果分组里最小的CustID是0(说明存在访客订单),同时最大的CustID大于0(说明存在客户订单),则该邮箱符合要求。
方法2:使用 EXISTS 子查询
通过两次子查询分别验证目标邮箱是否存在访客订单和客户订单,最终取交集:
SELECT DISTINCT o1.Email FROM tblOrders o1 WHERE EXISTS ( SELECT 1 FROM tblOrders o2 WHERE o2.Email = o1.Email AND o2.CustID = 0 ) AND EXISTS ( SELECT 1 FROM tblOrders o3 WHERE o3.Email = o1.Email AND o3.CustID != 0 );
方法3:INNER JOIN 关联两个订单子集
将访客订单的邮箱集合与客户订单的邮箱集合做内连接,直接得到同时存在两种订单的邮箱:
SELECT DISTINCT o_guest.Email FROM tblOrders o_guest INNER JOIN tblOrders o_customer ON o_guest.Email = o_customer.Email WHERE o_guest.CustID = 0 AND o_customer.CustID != 0;
结果验证
用你提供的测试数据,以上三种方法都会返回符合预期的结果:
test@test.com joe@blah.com
自动排除了仅存在访客订单的blah@blah.com和仅存在客户订单的mary@blah.com。
内容的提问来源于stack exchange,提问作者hanji
相关产品推荐
相关产品推荐

