You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何编写SQL查询找出users表中关联重复字段的所有行?

查询存在重复user_id、phone_number或email的行

表结构与测试数据

创建表的SQL:

DROP TABLE users;
CREATE TABLE users(
id int,
user_id int,
phone_number VARCHAR(30),
email VARCHAR(30));

插入测试数据的SQL:

INSERT INTO users
VALUES
(1, 999, 61412308310, 'can@gmail.com '),
(2, 129, 61477708777, 'acdc@gmail.com '),
(3, 213, 61488908495, 'adel99@gmail.com'),
(4, 145, 61477708777, 'austr@gmail.com'),
(5, 214, 61421445777, 'austr@gmail.com'),
(6, 214, 61421445326, 'jango@gmail.com');

解决方案

以下两种写法均可筛选出所有存在重复user_id、phone_number或email的行:

方法一:使用IN子查询

SELECT *
FROM users
WHERE user_id IN (SELECT user_id FROM users GROUP BY user_id HAVING COUNT(*) > 1)
   OR phone_number IN (SELECT phone_number FROM users GROUP BY phone_number HAVING COUNT(*) > 1)
   OR email IN (SELECT email FROM users GROUP BY email HAVING COUNT(*) > 1);

方法二:使用EXISTS(大表场景性能更优)

SELECT u.*
FROM users u
WHERE EXISTS (SELECT 1 FROM users u2 WHERE u2.user_id = u.user_id AND u2.id != u.id)
   OR EXISTS (SELECT 1 FROM users u2 WHERE u2.phone_number = u.phone_number AND u2.id != u.id)
   OR EXISTS (SELECT 1 FROM users u2 WHERE u2.email = u.email AND u2.id != u.id);

结果说明

两种写法都会返回预期的4条记录:

2, 129, 61477708777, 'acdc@gmail.com '
4, 145, 61477708777, 'austr@gmail.com'
5, 214, 61421445777, 'austr@gmail.com'
6, 214, 61421445326, 'jango@gmail.com'
  • 方法一通过子查询先找出各字段中重复的值集合,再匹配原表数据;
  • 方法二通过EXISTS直接校验当前行是否存在同字段值的其他记录,避免分组操作带来的性能损耗。

内容的提问来源于stack exchange,提问作者wdad asd

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 20:01:11