如何用SQL查询仅包含B、C类型记录的员工ID
找出无A类型记录的员工SQL方案
这是个很常见的SQL需求,我给你几种靠谱的写法,都能准确找出那些只有B、C类型记录,完全没有A类型的员工:
方法1:使用NOT EXISTS子查询(最直观)
这种方式逻辑清晰,直接排除掉存在'A'类型记录的员工:
SELECT DISTINCT e.`Emp id` FROM your_table e WHERE NOT EXISTS ( SELECT 1 FROM your_table e2 WHERE e2.`Emp id` = e.`Emp id` AND e2.type = 'A' );
说明:DISTINCT用来去重,因为同一个员工可能有多条B/C类型的记录,确保最终结果里每个员工ID只出现一次。
方法2:使用GROUP BY + HAVING统计
通过分组统计每个员工的'A'类型记录数,筛选出数量为0的员工:
SELECT `Emp id` FROM your_table GROUP BY `Emp id` HAVING SUM(CASE WHEN type = 'A' THEN 1 ELSE 0 END) = 0;
说明:SUM(CASE...)会统计每个员工的'A'类型记录总数,等于0就代表该员工没有任何'A'类型的记录。如果需要确保这些员工至少有B/C记录,可以在HAVING里再加COUNT(*) > 0(不过根据你的示例数据,这个条件可选)。
方法3:使用LEFT JOIN筛选NULL
通过左连接自身表,匹配'A'类型记录,然后筛选未匹配到的员工:
SELECT DISTINCT e.`Emp id` FROM your_table e LEFT JOIN your_table e2 ON e.`Emp id` = e2.`Emp id` AND e2.type = 'A' WHERE e2.`Emp id` IS NULL;
说明:左连接会保留所有左表的员工记录,右表只有匹配到'A'类型的才会有数据,所以e2.Emp id IS NULL就代表该员工没有'A'类型的记录。
以上三种方法都能得到你预期的结果(员工ID 2),你可以根据自己使用的数据库和数据量选择最合适的写法,一般来说NOT EXISTS在多数数据库中性能优化做得不错。
内容的提问来源于stack exchange,提问作者nimish jain
相关产品推荐
相关产品推荐

