You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SQL子查询比较计数:筛选所有记录类型均为'C'的人员

解决方法:筛选所有记录均为'C'的人员

嘿,我明白你的需求了——要找出那些**所有记录类型都是'C'**的人,也就是这个人的记录里完全没有'V'类型的条目。你提到想用子查询来比较总记录数和'C'类型的计数,这思路完全没问题,下面给你几种具体的实现方式:

方法1:用子查询统计总记录数和C类型记录数

这种方法直接对应你最初的思路,先通过子查询算出每个人的总记录数,再和当前查询中C类型的计数做比较:

SELECT 
    person_id,
    COUNT(*) AS c_record_count
FROM 
    your_table
WHERE 
    type = 'C'
GROUP BY 
    person_id
HAVING 
    COUNT(*) = (SELECT COUNT(*) FROM your_table t2 WHERE t2.person_id = your_table.person_id);

逻辑解释:

  • 外层查询先统计每个有'C'记录的人的C类型条目数
  • HAVING子句里的子查询会针对当前分组的person_id,算出这个人的所有记录总数
  • 当C类型的计数等于总记录数时,就说明这个人没有其他类型(也就是'V')的记录

方法2:用NOT EXISTS更高效地排除有'V'记录的人

如果你的表数据量比较大,这种方法可能性能更好,因为它直接排除那些存在'V'记录的人:

SELECT 
    person_id,
    COUNT(*) AS c_record_count
FROM 
    your_table t1
WHERE 
    type = 'C'
    AND NOT EXISTS (
        SELECT 1 
        FROM your_table t2 
        WHERE t2.person_id = t1.person_id 
          AND t2.type = 'V'
    )
GROUP BY 
    person_id;

逻辑解释:

  • NOT EXISTS子查询会检查当前person_id是否存在任何'V'类型的记录
  • 如果不存在,就说明这个人的所有记录都是'C',符合筛选条件

方法3:用HAVING结合条件计数简化逻辑

还有一种更简洁的写法,直接在分组后统计'V'类型的记录数,要求这个数为0:

SELECT 
    person_id,
    COUNT(*) AS c_record_count
FROM 
    your_table
GROUP BY 
    person_id
HAVING 
    SUM(CASE WHEN type = 'V' THEN 1 ELSE 0 END) = 0;

逻辑解释:

  • 先按person_id分组,统计每个人的所有记录
  • SUM(CASE...)会计算这个人的'V'类型记录数,当这个数为0时,说明没有'V'记录,所有记录都是'C'

你可以根据自己的表结构和数据量选择最合适的方法,这几种写法都能满足你的需求~

内容的提问来源于stack exchange,提问作者user3671361

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 06:54:19