You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何筛选未加入任何启用状态公司的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说明该账户没有任何关联的启用公司,符合筛选条件。


原有语句问题分析

  1. CTE语句错误:

    • 子查询误写字段:WHERE a.IsEnabled = 'True',你的Account表并没有IsEnabled字段,正确应为判断c.IsEnabled = 'True'。
    • 逻辑冗余:无需先筛选关联禁用公司的账户再反向排除,直接用NOT EXISTS即可一步到位。
  2. ALL语句逻辑错误:

    • c.IsEnabled = ALL (SELECT IsEnabled FROM Company WHERE IsEnabled = 'True')等价于c.IsEnabled = 'True',会筛选出关联启用公司的账户,与需求完全相反。

内容的提问来源于stack exchange,提问作者Axajkamkat

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 15:20:43