SQL查询:如何获取Field 1中对应Field 2无0值的取值
解决方法
先给出示例数据:
| Field 1 | Field 2 |
|---|---|
| AAA | 1 |
| AAA | 2 |
| AAA | 0 |
| BBB | 1 |
| BBB | 2 |
| CCC | 0 |
| CCC | 2 |
| DDD | 3 |
要筛选出Field 1中所有对应的Field 2记录都不含0的取值(即示例中的BBB和DDD),以下是几种实用的SQL写法:
方法1:GROUP BY + HAVING(条件聚合)
通过分组后检查每组是否存在Field2=0的记录:
SELECT Field1 FROM your_table GROUP BY Field1 HAVING MAX(CASE WHEN Field2 = 0 THEN 1 ELSE 0 END) = 0;
逻辑:用CASE语句把Field2=0的行标记为1,其他行标记为0,MAX值为0说明该分组下没有0值。
也可以用COUNT的变体实现相同逻辑:
SELECT Field1 FROM your_table GROUP BY Field1 HAVING COUNT(CASE WHEN Field2 = 0 THEN 1 END) = 0;
逻辑:仅统计Field2=0的记录数,结果为0则表示该分组无0值。
方法2:NOT EXISTS 子查询
通过排除那些存在Field2=0记录的Field1取值:
SELECT DISTINCT Field1 FROM your_table t_main WHERE NOT EXISTS ( SELECT 1 FROM your_table t_sub WHERE t_sub.Field1 = t_main.Field1 AND t_sub.Field2 = 0 );
逻辑:对每个Field1的取值,检查是否不存在对应的Field2=0记录,不存在则保留该取值。
方法3:EXCEPT(部分数据库支持)
如果你的数据库支持EXCEPT语法(如PostgreSQL、SQL Server),可以用集合差集实现:
SELECT DISTINCT Field1 FROM your_table EXCEPT SELECT DISTINCT Field1 FROM your_table WHERE Field2 = 0;
逻辑:先获取所有Field1的取值,减去那些存在Field2=0记录的Field1,剩余结果即为符合要求的取值。
内容的提问来源于stack exchange,提问作者KyriakosM1
相关产品推荐
相关产品推荐

