SQL如何查询单表中相同ID的多条记录,筛选购买A未购买C的客户
SQL查询解决方案
实现思路
先筛选满足两个条件的客户:
- 存在产品A的购买记录
- 不存在产品C的购买记录
再查询这些客户在表中的全部关联记录即可。
方案1:使用EXISTS子查询(性能最优,写法直观)
SELECT * FROM `Table A` t1 WHERE -- 筛选买过产品A的客户 EXISTS ( SELECT 1 FROM `Table A` t2 WHERE t2.`Customer ID` = t1.`Customer ID` AND t2.`Product Name` = 'A' ) -- 排除买过产品C的客户 AND NOT EXISTS ( SELECT 1 FROM `Table A` t3 WHERE t3.`Customer ID` = t1.`Customer ID` AND t3.`Product Name` = 'C' );
方案2:使用分组过滤后关联查询
SELECT t1.* FROM `Table A` t1 INNER JOIN ( -- 先筛选出符合条件的客户ID列表 SELECT `Customer ID` FROM `Table A` GROUP BY `Customer ID` HAVING SUM(CASE WHEN `Product Name` = 'A' THEN 1 ELSE 0 END) > 0 AND SUM(CASE WHEN `Product Name` = 'C' THEN 1 ELSE 0 END) = 0 ) t2 ON t1.`Customer ID` = t2.`Customer ID`;
注意事项
因为表名Table A和字段名Customer ID、Product Name包含空格,查询时需要用对应数据库的标识符包裹符:
- MySQL 用反引号
` - SQL Server 用方括号
[] - PostgreSQL 用双引号
"
上述示例为MySQL兼容写法,代入你提供的样例数据测试,输出结果和预期完全一致。
内容的提问来源于stack exchange,提问作者Ben Inm
相关产品推荐
相关产品推荐

