2016-04-03 54 views
4

我有一个users表,它具有employee_id列中的重复值。我需要列出所有包含重复employee_id的行及其名称。我需要查看所有重复使用employee_id的用户,以便我可以解除哪些值有效。用于选择一列中具有重复值的所有行的SQL

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; 

回答

8

你可以使用窗口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

+1

这是伟大的,谢谢! – Jason

相关问题