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

SQL如何查询同时满足两类字段组合条件的客户数据

你现有代码的问题是只写了单类匹配规则,只要调整WHERE条件逻辑,再加两层过滤规则即可,完整可运行的查询语句如下:

SELECT Cl.C_ID, ACCT.ACCT_ID, ACCT.TIER_ID, ACCT.STATUS
FROM CLIENTS Cl
INNER JOIN MEMBERSHIP MEM ON MEM.C_ID = Cl.C_ID
INNER JOIN MEMBERSHIP_ACCOUNT ACCT ON ACCT.M_ID = MEM.M_ID
-- 匹配单条账户的合法规则
WHERE (
    (ACCT.TIER_ID IN (1,2) AND ACCT.STATUS = 'ACTV')
    OR
    (ACCT.TIER_ID IN (3,4) AND ACCT.STATUS = 'NOCO')
)
-- 排除存在非法账户的客户
AND Cl.C_ID NOT IN (
    SELECT DISTINCT MEM2.C_ID
    FROM MEMBERSHIP MEM2
    INNER JOIN MEMBERSHIP_ACCOUNT ACCT2 ON ACCT2.M_ID = MEM2.M_ID
    WHERE NOT (
        (ACCT2.TIER_ID IN (1,2) AND ACCT2.STATUS = 'ACTV')
        OR
        (ACCT2.TIER_ID IN (3,4) AND ACCT2.STATUS = 'NOCO')
    )
)
-- 保证客户同时存在两类合法记录,过滤仅存在单类记录的客户(比如示例中的C_ID=2)
AND EXISTS (
    SELECT 1 FROM MEMBERSHIP MEM3
    INNER JOIN MEMBERSHIP_ACCOUNT ACCT3 ON ACCT3.M_ID = MEM3.M_ID
    WHERE MEM3.C_ID = Cl.C_ID AND ACCT3.TIER_ID IN (1,2) AND ACCT3.STATUS = 'ACTV'
)
AND EXISTS (
    SELECT 1 FROM MEMBERSHIP MEM4
    INNER JOIN MEMBERSHIP_ACCOUNT ACCT4 ON ACCT4.M_ID = MEM4.M_ID
    WHERE MEM4.C_ID = Cl.C_ID AND ACCT4.TIER_ID IN (3,4) AND ACCT4.STATUS = 'NOCO'
)
ORDER BY Cl.C_ID, ACCT.TIER_ID

逻辑说明:

  1. 第一层WHERE的OR逻辑,把两类合法的账户记录都匹配出来
  2. NOT IN子查询的作用是排除所有有非法账户的客户,比如示例中的C_ID=3存在Tier 2状态为CANC、Tier 4状态为ACTV的非法记录,会被直接过滤
  3. 最后两个EXISTS条件保证返回的客户同时满足「有Tier 1/2的ACTV账户」和「有Tier3/4的NOCO账户」两个要求,过滤掉只有单类合法记录的客户

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 10:45:05