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.
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.
SELECT employee_id, MAX(name) FROM users GROUP BY employee_id HAVING COUNT(employee_id) > 1;
To select duplicate values, you need to create groups of rows with the same values and then select the groups with counts greater than one. You can achieve that by using GROUP BY and a HAVING clause.
You could use windowed 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
:
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
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With