SQL实现查询跨多个类别出现的case_id对应全量记录
需求说明
你需要从名为cte的结果集中,筛选出**跨多个product_owner类别出现的case_id**关联的所有全字段记录。
原cte表字段及样例数据如下:
| product_owner | product_ownerid | owner_location | owner_locationid | case_id | unique_id |
|---|---|---|---|---|---|
| red | 123 | 得克萨斯州 | 321 | 12345 | 89076 |
| red | 123 | 得克萨斯州 | 321 | 12345 | 89075 |
| blue | 456 | 纽约 | 786 | 12678 | 90768 |
| blue | 456 | 纽约 | 786 | 12678 | 90769 |
| red | 123 | 得克萨斯州 | 321 | 12678 | 79072 |
以上样例中case_id=12678同时归属red、blue两个产品负责人类别,是需要保留的目标数据,期望输出结果如下:
| product_owner | product_ownerid | owner_location | owner_locationid | case_id | unique_id |
|---|---|---|---|---|---|
| blue | 456 | 纽约 | 786 | 12678 | 90768 |
| blue | 456 | 纽约 | 786 | 12678 | 90769 |
| red | 123 | 得克萨斯州 | 321 | 12678 | 79072 |
原有SQL的问题
你之前写的SQL如下:
SELECT DISTINCT cte.product_owner, cte.product_ownerid, cte.owner_location, cte.owner_locationid, cte.Case_ID, cte.unique_id FROM cte JOIN (SELECT Case_ID FROM cte GROUP BY Case_ID HAVING count (DISTINCT unique_id) >1) y ON cte.Case_ID = y.Case_ID ORDER BY cte.Case_Reference_ID
执行无法返回预期结果的原因有两个:
- 跨类别判断逻辑错误:子查询中用
COUNT(DISTINCT unique_id) >1作为筛选条件,会把同一类别下有多条记录的case也匹配出来,比如样例中case_id=12345仅属于red类别,但因为有2个不同unique_id,会被错误保留。 - 排序字段不存在:最后
ORDER BY引用的Case_Reference_ID字段在cte表中不存在,会直接触发执行报错。
正确实现代码
核心逻辑是先找出所有关联了2个及以上不同product_owner的case_id,再关联原表取出这些case对应的所有记录即可,不需要额外加DISTINCT去重(unique_id是行唯一标识,不存在完全重复的行):
SELECT cte.product_owner, cte.product_ownerid, cte.owner_location, cte.owner_locationid, cte.case_id, cte.unique_id FROM cte INNER JOIN ( SELECT case_id FROM cte GROUP BY case_id HAVING COUNT(DISTINCT product_owner) > 1 ) valid_case ON cte.case_id = valid_case.case_id ORDER BY cte.case_id;
内容的提问来源于stack exchange,提问作者On_demand
相关产品推荐
相关产品推荐

