2016-04-03 10 views
4

employee_id列に重複値を持つusersテーブルがあります。名前と一緒にemployee_idsを重複してすべての行をリストする必要があります。 employee_idの複製を持つすべてのユーザーを確認する必要があります。そのため、有効な値の競合を解消できます。SQLは、1つの列に重複値を持つすべての行を選択します。

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 

私は同様の質問を参照してください、私はまだ私は必要な正しい構文を取得することはできません。以下では、私は1つのオカレンスしか得ていません。私は上記のように複製物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

関連する問題