SQL外键多值匹配:如何查询房贷客户共同持有的储蓄账户
联名储蓄账户SQL查询实现方案
我们的目标是筛选出同时关联了指定房贷账户下所有客户的储蓄账户,本质是求该房贷绑定的全部客户在储蓄账户关联关系中的交集,可通过以下两种方式实现:
方案一:通用分组统计法(推荐)
该方案不受房贷账户绑定客户数量限制,后续如果规则调整支持绑定3个及以上客户,代码无需修改即可复用。
SELECT b.SAV_ACCT FROM Account_Customer a INNER JOIN B ON a.CUST = b.CUST WHERE a.HL_ACCT = 'HL_ACCT-1' GROUP BY b.SAV_ACCT HAVING COUNT(DISTINCT a.CUST) = ( SELECT COUNT(DISTINCT CUST) FROM Account_Customer WHERE HL_ACCT = 'HL_ACCT-1' );
逻辑说明:
- 先通过子查询统计出
HL_ACCT-1对应的总客户数 - 关联表A和表B,筛选出所有属于该房贷账户的客户对应的储蓄账户
- 按储蓄账户分组,统计每个账户关联的不同客户数量,数量等于总客户数的就是所有客户共同持有的联名账户
方案二:交集法(仅适合固定2位客户场景)
如果明确当前房贷账户只会绑定2位客户,也可以直接取两个客户各自储蓄账户的交集,逻辑更直观。
SELECT SAV_ACCT FROM B WHERE CUST = 'CUST_1' INTERSECT SELECT SAV_ACCT FROM B WHERE CUST = 'CUST_2';
该方案劣势为扩展性差,如果后续客户数量增加,需要对应新增INTERSECT查询块。
注意事项
- 统计客户数时建议加上
DISTINCT,避免同个客户与同个储蓄账户存在重复关联数据时导致计数错误 - 如果业务侧已经保证表B中
<CUST, SAV_ACCT>组合唯一,可去掉DISTINCT提升查询效率
内容的提问来源于stack exchange,提问作者Annie
相关产品推荐
相关产品推荐

