如何查询下属所有物业为INACTIVE但自身未标记INACTIVE的客户?
解决方案
下面提供几种不同的SQL查询写法,都能满足你的需求:
方法1:使用NOT EXISTS子查询
这种写法逻辑直观,先筛选出状态非INACTIVE的客户,再排除掉存在至少一个非INACTIVE物业的客户:
SELECT cd.* FROM ClientData cd WHERE cd.Status != 'INACTIVE' AND NOT EXISTS ( SELECT 1 FROM PropertyData pd WHERE pd.ClientID = cd.ClientID AND pd.Status != 'INACTIVE' );
方法2:GROUP BY + HAVING统计
通过关联客户和物业表,按客户分组后统计非INACTIVE物业的数量,数量为0则说明所有物业都是INACTIVE:
SELECT cd.* FROM ClientData cd JOIN PropertyData pd ON cd.ClientID = pd.ClientID WHERE cd.Status != 'INACTIVE' GROUP BY cd.ClientID, cd.Status -- 需根据数据库要求调整GROUP BY字段,确保包含SELECT中的非聚合列 HAVING COUNT(CASE WHEN pd.Status != 'INACTIVE' THEN 1 END) = 0;
方法3:LEFT JOIN排除法
左连接客户表与非INACTIVE的物业表,若连接结果中物业记录为空,说明该客户没有非INACTIVE的物业:
SELECT cd.* FROM ClientData cd LEFT JOIN PropertyData pd ON cd.ClientID = pd.ClientID AND pd.Status != 'INACTIVE' WHERE cd.Status != 'INACTIVE' AND pd.ClientID IS NULL;
补充说明
如果需要排除没有任何物业的客户,可以在上述查询的WHERE条件中添加:
AND EXISTS (SELECT 1 FROM PropertyData pd WHERE pd.ClientID = cd.ClientID)
内容的提问来源于stack exchange,提问作者Ricky Kwong
相关产品推荐
相关产品推荐

