如何筛选未加入任何启用状态公司的Account数据?
解决方案
方法1:NOT EXISTS(简洁高效)
直接筛选不存在任何关联启用状态公司的账户,逻辑清晰且性能通常更优:
SELECT a.Id, a.Name FROM Account a WHERE NOT EXISTS ( SELECT 1 FROM AccountInCompany ac INNER JOIN Company c ON ac.CompanyId = c.Id WHERE ac.AccountId = a.Id AND c.IsEnabled = 'True' )
该语句覆盖两种符合要求的情况:
- 账户关联的所有公司均为禁用状态(如示例中的账户3、4)
- 账户未关联任何公司(若不需要这类账户,可在WHERE后追加
AND EXISTS (SELECT 1 FROM AccountInCompany ac WHERE ac.AccountId = a.Id))
方法2:GROUP BY + HAVING
通过分组账户,验证其关联的所有公司均无启用状态:
SELECT a.Id, a.Name FROM Account a INNER JOIN AccountInCompany ac ON a.Id = ac.AccountId INNER JOIN Company c ON ac.CompanyId = c.Id GROUP BY a.Id, a.Name HAVING MAX(CASE WHEN c.IsEnabled = 'True' THEN 1 ELSE 0 END) = 0
解释:用CASE表达式标记每条关联记录是否对应启用公司,分组后MAX值为0说明该账户没有任何关联的启用公司,符合筛选条件。
原有语句问题分析
CTE语句错误:
- 子查询误写字段:
WHERE a.IsEnabled = 'True',你的Account表并没有IsEnabled字段,正确应为判断c.IsEnabled = 'True'。 - 逻辑冗余:无需先筛选关联禁用公司的账户再反向排除,直接用NOT EXISTS即可一步到位。
- 子查询误写字段:
ALL语句逻辑错误:
c.IsEnabled = ALL (SELECT IsEnabled FROM Company WHERE IsEnabled = 'True')等价于c.IsEnabled = 'True',会筛选出关联启用公司的账户,与需求完全相反。
内容的提问来源于stack exchange,提问作者Axajkamkat
相关产品推荐
相关产品推荐

