一对多关联表数据筛选:获取无Not Active状态的客户CID
问题分析与解决:筛选未拥有"Not Active"状态的客户CID
原SQL的问题
你的SQL逻辑完全偏离需求:
- 需求是找从未拥有"Not Active"状态的客户,但你写的
WHERE B.[Status] = 'Not Active'是在筛选存在"Not Active"状态的客户记录,方向完全相反。 - 另外你提到执行后得到CID1、2、3,这和你贴的SQL逻辑不符——按你贴的语句,应该只会返回CID=1的那条记录,推测你实际执行的语句可能和你写的不一致。
正确的SQL写法
方法1:NOT EXISTS子查询(最直观,性能也较好)
SELECT A.[CID] FROM [Client table] AS A WHERE NOT EXISTS ( SELECT 1 FROM [Status table] AS B WHERE A.[CID] = B.[CID] AND B.[Status] = 'Not Active' )
逻辑:遍历每个客户,判断该客户是否不存在任何一条状态为"Not Active"的记录,符合条件的就是目标客户。
方法2:LEFT JOIN + IS NULL
SELECT DISTINCT A.[CID] FROM [Client table] AS A LEFT JOIN [Status table] AS B ON A.[CID] = B.[CID] AND B.[Status] = 'Not Active' WHERE B.[CID] IS NULL
逻辑:将客户表与状态为"Not Active"的记录做左连接,那些无法匹配到对应记录的客户(即B.[CID] IS NULL),就是从未拥有该状态的客户。DISTINCT用于避免重复结果(因客户表CID唯一,也可省略)。
方法3:GROUP BY + HAVING统计
SELECT CID FROM [Status table] GROUP BY CID HAVING SUM(CASE WHEN [Status] = 'Not Active' THEN 1 ELSE 0 END) = 0
逻辑:按CID分组,统计每个客户下"Not Active"状态的记录数,数量为0的就是没有该状态的客户。如果需要客户表的其他字段,可再与Client表做关联查询。
内容的提问来源于stack exchange,提问作者Harry
相关产品推荐
相关产品推荐

