如何编写SQL查询筛选仅持有储蓄账户的客户
解决仅筛选持有储蓄账户客户的SQL问题
你的原查询只是找出了拥有储蓄账户的客户,但Jane同时持有其他类型账户,所以会被错误包含。要得到仅持有储蓄账户的客户,需要排除那些存在非储蓄账户的客户,以下是两种可行方案:
方案一:使用NOT EXISTS子查询
SELECT DISTINCT A.customer_name FROM A.Table1 A INNER JOIN B.Table2 B ON A.acct_number = B.acct_number WHERE B.account_type = 'savings' AND NOT EXISTS ( SELECT 1 FROM B.Table2 B2 WHERE B2.acct_number = A.acct_number AND B2.account_type != 'savings' );
逻辑说明:先筛选出有储蓄账户的客户记录,再通过NOT EXISTS排除掉同一客户名下存在非储蓄账户的情况,DISTINCT用于避免同一客户多个储蓄账户导致的重复结果。
方案二:使用分组+HAVING子句
SELECT A.customer_name FROM A.Table1 A INNER JOIN B.Table2 B ON A.acct_number = B.acct_number GROUP BY A.customer_name HAVING COUNT(DISTINCT B.account_type) = 1 AND MAX(B.account_type) = 'savings';
逻辑说明:按客户姓名分组后,通过HAVING条件限制该客户的账户类型只有1种,且这种类型是储蓄账户,这样就能确保客户没有其他类型的账户。
原查询问题说明
原查询仅过滤了账户类型为储蓄的记录,但没有校验客户是否存在其他类型账户,所以持有储蓄+其他账户的Jane会被错误返回。
内容的提问来源于stack exchange,提问作者user27210645
相关产品推荐
相关产品推荐

