You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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条:

IDhired_frequency
5283
5265
4133
5001

内容的提问来源于stack exchange,提问作者Augusto

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 14:06:04