如何查询pollerstatus表中所有rowstatus≠1的nodeid
解决方法:筛选所有rowstatus均不等于1的nodeid
你的需求是找出所有记录的rowstatus都不等于1的nodeid,原SQL的问题在于只统计了rowstatus≠1的记录数,但没有排除那些同时存在rowstatus=1的nodeid(比如1014)。以下是两种可行的解决方案:
方法一:GROUP BY 结合 HAVING 子句
通过分组后过滤掉存在rowstatus=1的nodeid:
SELECT NodeID FROM pollerstatus GROUP BY NodeID HAVING COUNT(CASE WHEN rowstatus = 1 THEN 1 END) = 0;
解释:
- 先按
NodeID分组,统计每个分组中rowstatus=1的记录数量。 HAVING子句筛选出该数量为0的分组,说明这个NodeID下没有任何一条记录的rowstatus等于1,完全符合需求。
也可以用SUM实现相同逻辑:
SELECT NodeID FROM pollerstatus GROUP BY NodeID HAVING SUM(CASE WHEN rowstatus = 1 THEN 1 ELSE 0 END) = 0;
方法二:NOT EXISTS 子查询
通过子查询检查每个NodeID是否不存在rowstatus=1的记录:
SELECT DISTINCT NodeID FROM pollerstatus ps WHERE NOT EXISTS ( SELECT 1 FROM pollerstatus WHERE NodeID = ps.NodeID AND rowstatus = 1 );
解释:
- 外层查询遍历每个
NodeID,子查询检查当前NodeID是否存在rowstatus=1的记录。 NOT EXISTS确保只返回那些没有rowstatus=1记录的NodeID,DISTINCT用于去重,避免同一个NodeID被多次返回。
原SQL的问题分析
你之前的SQL仅筛选了rowstatus != 1的记录再分组统计,这会把像1014这种部分记录符合条件、但存在rowstatus=1记录的NodeID也包含进来,不符合“所有rowstatus均不等于1”的核心需求。
内容的提问来源于stack exchange,提问作者BaldFeegle
相关产品推荐
相关产品推荐

