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
逻辑说明:
- 第一层WHERE的OR逻辑,把两类合法的账户记录都匹配出来
- NOT IN子查询的作用是排除所有有非法账户的客户,比如示例中的C_ID=3存在Tier 2状态为CANC、Tier 4状态为ACTV的非法记录,会被直接过滤
- 最后两个EXISTS条件保证返回的客户同时满足「有Tier 1/2的ACTV账户」和「有Tier3/4的NOCO账户」两个要求,过滤掉只有单类合法记录的客户
内容的提问来源于stack exchange,提问作者John Yang
相关产品推荐
相关产品推荐

