如何使用SQLite查询同名字段的重复行并展示对应完整数据?
SQLite查询姓名重复人员记录方案
你可以通过以下两种常用方式实现需求,两种方法均能返回所有姓名相同、但person_no不同的完整人员行:
写法1:子查询+IN筛选(兼容所有SQLite版本)
-- 请将代码中的person_info替换为你实际的表名 SELECT person_no, name, birthday FROM person_info WHERE name IN ( SELECT name FROM person_info GROUP BY name HAVING COUNT(DISTINCT person_no) > 1 ) ORDER BY name, person_no;
逻辑说明:内层子查询先按姓名分组,筛选出对应超过1个唯一person_no的姓名,外层查询直接拉取这些姓名对应的所有完整记录,写法简单易理解,适合入门使用。
写法2:窗口函数(适用于SQLite 3.25及以上版本)
-- 请将代码中的person_info替换为你实际的表名 WITH person_stat AS ( SELECT *, COUNT(DISTINCT person_no) OVER (PARTITION BY name) AS name_people_cnt FROM person_info ) SELECT person_no, name, birthday FROM person_stat WHERE name_people_cnt > 1 ORDER BY name, person_no;
逻辑说明:用CTE加窗口函数的方式,按姓名分区统计每个姓名对应的人员数量,直接过滤出数量大于1的记录即可,后续如果需要在结果中同步展示重复次数,拓展更方便。
针对你给出的样例表,两种写法的运行结果一致:
| person_no | name | birthday |
|---|---|---|
| 01 | John | 01/01/2000 |
| 02 | John | 15/03/2000 |
内容的提问来源于stack exchange,提问作者Calvin Mela
相关产品推荐
相关产品推荐

