Postgres如何查询履约次数不足/无履约记录的合同数据
问题根因
原有SQL无法返回无履约记录合同的核心原因是:当合同没有对应的occurrences记录时,子查询返回NULL,hired_frequency > NULL的判断结果为未知,无法命中WHERE筛选条件。同时子查询中多余的GROUP BY也不是必要的,关联条件已经限定了只统计对应合同的履约次数。
正确SQL实现
方案1:子查询适配空值(最小改动原有写法)
通过COALESCE函数将空的统计结果转为0,即可匹配无履约记录的场景:
SELECT * FROM contracts WHERE hired_frequency > COALESCE( (SELECT COUNT(*) FROM occurrences WHERE contracts.ID = occurrences.contract_id), 0 );
方案2:LEFT JOIN分组统计(性能更稳定、可读性更高)
用左连接关联履约表后分组统计,自然处理无匹配记录的场景:
SELECT c.ID, c.hired_frequency FROM contracts c LEFT JOIN occurrences o ON c.ID = o.contract_id GROUP BY c.ID, c.hired_frequency HAVING c.hired_frequency > COUNT(o.contract_id);
说明:COUNT(o.contract_id)会忽略左连接产生的NULL值,无履约记录的合同统计结果自动为0,无需额外处理空值。
筛选结果
符合要求的合同共4条:
| ID | hired_frequency |
|---|---|
| 528 | 3 |
| 526 | 5 |
| 413 | 3 |
| 500 | 1 |
内容的提问来源于stack exchange,提问作者Augusto
相关产品推荐
相关产品推荐

