I have a users
table that has duplicate values in the employee_id
column. I need to list all rows with duplicate employee_ids, along with their names. I need to see all users with a duplicate employee_id
so I can de-conflict which values are valid.
我有一个users表,在employee_id列中有重复的值。我需要列出所有具有重复employee_ids的行及其名称。我需要查看所有具有重复employee_id的用户,以便我可以解除哪些值有效。
SELECT name,employee_id
FROM users;
name | employee_id
-----------------------
jason 12345
tom 34567
jane 12345
will 01020
bill 12345
I need to return:
我需要回复:
name | employee_id
-------------------------
jason 12345
jane 12345
bill 12345
I see similar questions, but I still can't get the correct syntax I need. With the below I am only getting one occurrence. I need all occurances with duplicate employee_id
like above.
我看到类似的问题,但我仍然无法获得我需要的正确语法。以下我只会发生一次。我需要像上面那样重复employee_id的所有发生。
SELECT employee_id, MAX(name)
FROM users
GROUP BY employee_id
HAVING COUNT(employee_id) > 1;
1 个解决方案
#1
9
You could use windowed COUNT
:
您可以使用窗口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
or simple IN
:
或简单的IN:
SELECT *
FROM users
WHERE employee_id IN (SELECT employee_id
FROM users
GROUP BY employee_id
HAVING COUNT(employee_id) > 1);
LiveDemo2
or correlated subquery:
或相关子查询:
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
9
You could use windowed COUNT
:
您可以使用窗口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
or simple IN
:
或简单的IN:
SELECT *
FROM users
WHERE employee_id IN (SELECT employee_id
FROM users
GROUP BY employee_id
HAVING COUNT(employee_id) > 1);
LiveDemo2
or correlated subquery:
或相关子查询:
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