如何按isPrincipal条件依据baseProduct列删除重复SQL数据
数据过滤SQL实现方案
示例数据表
| pk | baseProduct | isPrincipal |
|---|---|---|
| 1 | 10 | 1 |
| 2 | 11 | 1 |
| 3 | 12 | 0 |
| 4 | 13 | 0 |
| 5 | 11 | 0 |
| 6 | 15 | 0 |
| 7 | 29 | 0 |
需求说明
- 对于同一
baseProduct,若存在isPrincipal=1的主条目,仅保留所有主条目行,删除同baseProduct下isPrincipal=0的行(如示例中pk=5的行需删除) - 若同一
baseProduct无主条目,则保留该baseProduct的所有行
实现方法
方法1:使用EXISTS子查询(简洁易理解,推荐)
SELECT pk, baseProduct, isPrincipal FROM your_union_result_table t1 WHERE isPrincipal = 1 OR NOT EXISTS ( SELECT 1 FROM your_union_result_table t2 WHERE t2.baseProduct = t1.baseProduct AND t2.isPrincipal = 1 );
逻辑解释:
- 直接保留所有
isPrincipal=1的主条目行 - 对于
isPrincipal=0的行,仅当该baseProduct不存在任何主条目时才保留
方法2:使用CTE筛选主条目集合
WITH has_principal AS ( -- 先找出所有存在主条目的baseProduct SELECT DISTINCT baseProduct FROM your_union_result_table WHERE isPrincipal = 1 ) SELECT pk, baseProduct, isPrincipal FROM your_union_result_table -- 主条目集合内的baseProduct仅保留主条目,其余保留所有行 WHERE (baseProduct IN (SELECT baseProduct FROM has_principal) AND isPrincipal = 1) OR baseProduct NOT IN (SELECT baseProduct FROM has_principal);
逻辑解释:
- 先通过CTE生成包含所有有主条目
baseProduct的集合 - 按集合划分筛选规则:属于集合的
baseProduct只留主条目,不属于集合的baseProduct留所有行
执行结果
两种方法执行后都会得到符合需求的结果:
| pk | baseProduct | isPrincipal |
|---|---|---|
| 1 | 10 | 1 |
| 2 | 11 | 1 |
| 3 | 12 | 0 |
| 4 | 13 | 0 |
| 6 | 15 | 0 |
| 7 | 29 | 0 |
内容的提问来源于stack exchange,提问作者Nicolas Villacorta
相关产品推荐
相关产品推荐

