如何从数据表中提取所有邮箱地址全部缺失的管理者记录
筛选所有邮箱全缺失的管理者记录
嗨,这个需求处理起来很清晰,咱们可以通过两种常用思路来实现,适配大多数数据库环境:
方法一:聚合子查询(通用SQL写法)
这是最兼容的写法,几乎所有数据库都支持:
SELECT t.* FROM your_table t WHERE t.Manager_Name IN ( SELECT Manager_Name FROM your_table GROUP BY Manager_Name -- 统计非Null邮箱数量,等于0说明全是缺失 HAVING COUNT(Email_Address) = 0 )
解释
- 内层子查询通过
GROUP BY Manager_Name按管理者分组,COUNT(Email_Address)只会统计非Null的邮箱条目,结果为0就代表该管理者的所有邮箱都缺失。 - 外层查询直接匹配这些管理者,把他们的所有记录都提取出来。
如果你的数据表中存的是字符串'Null'而非SQL原生的NULL值,只需要调整内层的判断逻辑:
SELECT t.* FROM your_table t WHERE t.Manager_Name IN ( SELECT Manager_Name FROM your_table GROUP BY Manager_Name HAVING COUNT(CASE WHEN Email_Address != 'Null' THEN 1 END) = 0 )
方法二:窗口函数(适合支持窗口函数的数据库)
如果你的数据库支持窗口函数(比如MySQL 8+、PostgreSQL、SQL Server等),这种写法更高效,不需要额外关联:
SELECT Manager_Name, Email_Address FROM ( SELECT *, -- 按管理者分组统计非Null邮箱数量 COUNT(Email_Address) OVER (PARTITION BY Manager_Name) AS valid_email_count FROM your_table ) sub_query WHERE valid_email_count = 0
解释
窗口函数COUNT(Email_Address) OVER (PARTITION BY Manager_Name)会给每条记录打上一个标记,显示对应管理者的有效邮箱总数。我们只需要筛选出总数为0的记录即可。
同样,如果是字符串'Null'的情况,调整窗口函数的统计逻辑:
SELECT Manager_Name, Email_Address FROM ( SELECT *, COUNT(CASE WHEN Email_Address != 'Null' THEN 1 END) OVER (PARTITION BY Manager_Name) AS valid_email_count FROM your_table ) sub_query WHERE valid_email_count = 0
内容的提问来源于stack exchange,提问作者Soufiane Benounssi
相关产品推荐
相关产品推荐

