如何筛选出在orders表有匹配记录的customers表无重复行?
筛选存在对应订单的客户记录(去重)
根据你给出的两张表,要筛选出customers表中在orders表有对应记录的行,同时保证结果无重复,有以下几种常用的SQL实现方式:
方法一:使用INNER JOIN + DISTINCT
通过内连接关联两张表,再用DISTINCT去除因为一个客户多条订单产生的重复记录:
SELECT DISTINCT c.id, c.name FROM customers c INNER JOIN orders o ON c.id = o.customer_id;
执行后结果:
+----+-------------+ | id | name | +----+-------------+ | 1 | roger | | 3 | harold | | 4 | tom | +----+-------------+
方法二:使用EXISTS子查询
EXISTS会检查子查询是否存在匹配记录,找到即停止检索,性能更优;且基于customers单表查询,天然不会产生重复:
SELECT c.id, c.name FROM customers c WHERE EXISTS ( SELECT 1 FROM orders o WHERE o.customer_id = c.id );
该语句结果与方法一完全一致,无需额外去重操作。
方法三:使用IN子查询
通过子查询提取所有存在订单的客户ID,再筛选customers表:
SELECT c.id, c.name FROM customers c WHERE c.id IN ( SELECT o.customer_id FROM orders o );
即使子查询返回重复的客户ID,IN会自动处理去重,最终结果无重复客户记录。
内容的提问来源于stack exchange,提问作者cfx
相关产品推荐
相关产品推荐

