如何修改SQL查询:仅返回所有子记录符合条件的主记录
如何修改SQL查询以返回所有子记录均符合条件的主记录
原查询用于获取存在至少一条符合条件子记录的主记录,但我们需要调整为返回**所有子记录都满足PosIsException IS NULL**的主记录——也就是排除那些存在PosIsException IS NOT NULL子记录的主记录,同时排除没有符合条件子记录的主记录(比如示例中的Id=3)。
方法一:使用NOT EXISTS排除不符合条件的主记录
这是性能表现较好的方案,尤其适合子表有索引的场景:
SELECT i.* FROM Incidents i -- 确保主记录至少有一条子记录 WHERE EXISTS ( SELECT 1 FROM IncidentDetails d WHERE d.IncidentId = i.Id ) -- 确保主记录下没有任何子记录的PosIsException不为空 AND NOT EXISTS ( SELECT 1 FROM IncidentDetails d WHERE d.IncidentId = i.Id AND d.PosIsException IS NOT NULL );
方法二:使用GROUP BY + HAVING过滤
通过分组统计不符合条件的子记录数量,确保数量为0:
SELECT i.* FROM Incidents i JOIN IncidentDetails d ON d.IncidentId = i.Id GROUP BY i.Id -- 注意:不同数据库对GROUP BY的规则不同,若需返回i的所有列,需确保所有列都在GROUP BY中或使用聚合函数 HAVING COUNT(CASE WHEN d.PosIsException IS NOT NULL THEN 1 END) = 0;
这两种方案都能准确返回示例中Id=2的主记录,同时排除Id=1和Id=3的记录。
内容的提问来源于stack exchange,提问作者sgrysoft
相关产品推荐
相关产品推荐

