SQL选择一列中具有重复值的所有行

Posted

技术标签:

【中文标题】SQL选择一列中具有重复值的所有行【英文标题】:SQL to select all rows with duplicate values in one column 【发布时间】:2016-07-22 21:35:54 【问题描述】:

我有一个 users 表,在 employee_id 列中有重复值。我需要列出所有具有重复employee_id 的行及其名称。我需要查看所有具有重复 employee_id 的用户,以便我可以消除哪些值有效的冲突。

SELECT name,employee_id  
FROM users;

name     | employee_id
-----------------------
jason      12345
tom        34567 
jane       12345
will       01020
bill       12345

我需要返回:

name       | employee_id
-------------------------
jason        12345
jane         12345
bill         12345

我看到类似的问题,但我仍然无法获得所需的正确语法。在下面我只出现一次。我需要所有出现重复的employee_id 像上面一样。

SELECT employee_id, MAX(name) 
FROM users 
GROUP BY employee_id 
HAVING COUNT(employee_id) > 1;

【问题讨论】:

【参考方案1】:

你可以使用窗口化的COUNT:

SELECT sub.name, sub.employee_id
FROM (SELECT *, COUNT(*) OVER(PARTITION BY employee_id) AS c
      FROM users) AS sub
WHERE c > 1;

LiveDemo

或者简单的IN:

SELECT *
FROM users
WHERE employee_id IN (SELECT employee_id 
                      FROM users 
                      GROUP BY employee_id 
                      HAVING COUNT(employee_id) > 1);

LiveDemo2

或相关子查询:

SELECT name, employee_id
FROM users u
,LATERAL (SELECT COUNT(*) FROM users u2 WHERE u.employee_id = u2.employee_id) AS s(c)
WHERE c > 1;

SqlFiddleDemo

【讨论】:

以上是关于SQL选择一列中具有重复值的所有行的主要内容,如果未能解决你的问题,请参考以下文章

SQL 选择以消除在下一列中具有 2 个其他值的重复值

编写 SQL 查询,选择除同时在三列中具有指定值的行之外的所有行

如何识别所有行的至少一列中具有值的 ID?

如何选择在某列中具有相同值的所有行

返回除一列中具有重复 ID 的行之外的所有列

SQL查询从通配符列等于值的所有表中选择所有行[重复]