基于USERS与U_DETAILS表的重复用户行SQL查询方法
需求核心判定逻辑
需要筛选的用户满足:自身的DOB(出生日期),和自身在U_DETAILS表中登记的任意一个姓名,能匹配到至少一个其他独立用户,且该用户的DOB和姓名和当前用户完全一致。
几个关键判定边界:
- 同一个用户在U_DETAILS的多条同姓名记录(比如示例中uid=3的两条Jill记录),不算「多个用户」
- 只要用户有任意一个姓名+DOB的组合能匹配跨用户的重复,就需要被筛选出来
实现方案
方案1:EXISTS关联判定
通过子查询逐行匹配跨用户的重复组合,写法直观、性能适配多数中小数据量场景:
SELECT DISTINCT u.* FROM USERS u INNER JOIN U_DETAILS ud ON u.uid = ud.uid WHERE EXISTS ( SELECT 1 FROM USERS u_other INNER JOIN U_DETAILS ud_other ON u_other.uid = ud_other.uid -- 匹配相同出生日期、相同姓名 WHERE u_other.DOB = u.DOB AND ud_other.name = ud.name -- 排除当前用户自身,确保是跨用户的重复 AND u_other.uid <> u.uid );
方案2:分组聚合匹配
先统计所有存在跨用户重复的(DOB, name)组合,再反查关联的用户,适合大表场景:
WITH valid_duplicate_groups AS ( SELECT u.DOB, ud.name FROM USERS u INNER JOIN U_DETAILS ud ON u.uid = ud.uid GROUP BY u.DOB, ud.name -- 统计每个组合下的独立用户数,大于1才符合“多用户共用”的要求 HAVING COUNT(DISTINCT u.uid) > 1 ) SELECT DISTINCT u.* FROM USERS u INNER JOIN U_DETAILS ud ON u.uid = ud.uid INNER JOIN valid_duplicate_groups vg ON u.DOB = vg.DOB AND ud.name = vg.name;
示例数据结果验证
按给定的样例数据逐组校验:
- 符合跨用户重复的(DOB, name)组合仅为
(1981-01-10, Jack),关联的独立用户为uid=1、uid=2 - 其余组合均不满足要求:
(1981-01-10, Peter)仅关联uid=1(1981-01-10, Sam)仅关联uid=2(1971-01-10, Jill)仅关联uid=3(虽有2条detail记录,但属于单用户)
- 两个方案最终返回的USERS表记录均为uid=1、uid=2,和预期完全一致
常见踩坑提醒:如果分组统计时误用
COUNT(*)替代COUNT(DISTINCT u.uid),会把单个用户的多条重复U_DETAILS记录误判为多用户重复,把示例中的uid=3错误纳入结果。
内容的提问来源于stack exchange,提问作者Nasir Iqbal
相关产品推荐
相关产品推荐

