如何用SQL筛选拥有多个不同prd_id的cust_id并优化代码?
SQL代码优化与修正
原代码的问题
- 语法错误:连续写了两个独立的
where子句,不符合SQL语法规范 - 逻辑缺失:
exists子查询未与主表的cust_id建立关联,无法精准筛选出目标客户 - 条件偏差:
having count(*) >=1仅筛选出至少拥有一个指定产品的客户,无法满足“拥有多个不同prd_id”的需求
优化后的简洁写法
方法1:使用窗口函数(推荐,代码简洁且效率较高)
SELECT DISTINCT cust_id, prd_id FROM ( SELECT cust_id, prd_id, -- 统计每个客户拥有的不同产品数量 COUNT(DISTINCT prd_id) OVER (PARTITION BY cust_id) AS prd_count FROM acct_tbl WHERE prd_id IN ('prdA','prdB','prdC') ) t -- 只保留拥有2个及以上不同产品的客户记录 WHERE prd_count >= 2;
方法2:先筛选目标客户再关联
SELECT a.cust_id, a.prd_id FROM acct_tbl a -- 先找出符合条件的客户 JOIN ( SELECT cust_id FROM acct_tbl WHERE prd_id IN ('prdA','prdB','prdC') GROUP BY cust_id -- 统计不同产品数量≥2的客户 HAVING COUNT(DISTINCT prd_id) >= 2 ) b ON a.cust_id = b.cust_id WHERE a.prd_id IN ('prdA','prdB','prdC');
关键说明
- 必须用
COUNT(DISTINCT prd_id),避免同一客户同一产品对应多个账号时的计数错误 - 两种方法都先限定了产品范围,仅处理指定的
prdA/prdB/prdC - 窗口函数写法无需额外关联,代码更清爽;关联写法在部分数据库中性能表现更优,可根据实际场景选择
内容的提问来源于stack exchange,提问作者mojek
相关产品推荐
相关产品推荐

