求编写SQL查询:仅返回所有服务EXECUTED_VALUE非空的供应商
解决方案:筛选所有服务EXECUTED_VALUE均非空的供应商
方法一:使用NOT EXISTS子查询(推荐,性能通常更优)
这个方法直接过滤掉存在任何executed_value为NULL服务的供应商:
SELECT DISTINCT f.supplier_id, f.supplier_name FROM supplier f WHERE NOT EXISTS ( SELECT 1 FROM service s WHERE s.id_supplier = f.id_supplier AND s.executed_value IS NULL );
逻辑说明:
- 子查询检查当前供应商是否存在一条服务记录的
executed_value为NULL NOT EXISTS确保只返回完全没有这类记录的供应商DISTINCT保证最终结果没有重复的供应商条目
方法二:使用GROUP BY + HAVING
通过分组统计来验证所有服务的executed_value均非空:
写法1:统计null的数量为0
SELECT f.supplier_id, f.supplier_name FROM supplier f JOIN service s ON f.id_supplier = s.id_supplier GROUP BY f.supplier_id, f.supplier_name HAVING COUNT(CASE WHEN s.executed_value IS NULL THEN 1 END) = 0;
写法2:对比有效值数量与总服务数量
SELECT f.supplier_id, f.supplier_name FROM supplier f JOIN service s ON f.id_supplier = s.id_supplier GROUP BY f.supplier_id, f.supplier_name HAVING COUNT(s.executed_value) = COUNT(s.id_supplier);
逻辑说明:
COUNT(s.executed_value)会自动忽略NULL值,统计的是该供应商executed_value非空的服务数量COUNT(s.id_supplier)统计的是该供应商的所有服务数量- 当两者相等时,说明所有服务的
executed_value都不为NULL
关于你尝试COUNT函数未成功的说明
如果之前用了COUNT(*),它会把包含NULL的记录也统计进去,无法区分有效值和空值,所以得不到正确结果。上面的两种HAVING写法都是针对空值做了针对性统计,能解决问题。
内容的提问来源于stack exchange,提问作者Leonardo Rodrigues
相关产品推荐
相关产品推荐

