2016-11-29 2 views
0

У меня есть сотрудник таблицы с двумя столбцами-empid (primary key), name. Предположим, что он имеет три строки.SQL select statement, избегая дублированных строк на основе первичного ключа

EmpID Name 
--------------- 
11  Name1 
12  Name2 
11  Name3 

Как написать инструкцию select для выбора записей, избегая двух строк, которые дублируют empid. Я использовал запрос как:

select empid, name 
from(select empid, name, row_number() over(partition by empid order by empid desc) rnk 
    from t)a 
where a.rnk=1 

Но этот запрос будет давать

EmpID Name 
--------------- 
11  Name1 
12  Name2 

В результате. Но все, что мне нужно, это

EmpID Name 
--------------- 
12  Name2 
+4

Ну, если empid является первичным ключом, то почему у вас есть дубликаты значений? –

+0

Просто измените 'row_number()' for 'count()', и вы должны получить нужный результат. – GarethD

ответ

0

попробовать этот запрос, это будет работать и даст вам ряд 12 Имя2

выберите EmpId, имя от работника присоединиться ( выберите EmpId, граф (EmpID) в count1 от сотрудника группы по EmpId , имеющей рассчитывать (EmpID) = 1) б на a.empid = b.empid

0

Не было SELECT max(empid) as empid, name from employee group by name having count(distinct empid) < 2 работы?

0
select empid, name 
from(select empid, name,count(*) over(partition by empid) cnt from t) t 
where cnt=1 
0

anti join использованием NOT EXISTS может быть самым быстрым подход:

SELECT empID, Name 
FROM T 
WHERE NOT EXISTS (SELECT 1 FROM T AS T2 WHERE T2.EmpID = T.EmpID AND T2.Name <> T.Name); 

Я не проводил никаких испытаний, поэтому возможно, что оптимизатор может создать анти-полу-соединение, используя операцию count = 1, но это дает ему наилучшие шансы добраться до этого плана.

+1

все ли мы будем игнорировать тот факт, что что-то не так, когда в столбце PK есть повторяющиеся значения? не должно быть необходимости в этой строке SQL в первую очередь. или я не прав? –

+0

Я уже посмотрел этот факт, потому что это не похоже на ответ на вопрос: «Как написать инструкцию select для выбора записей, избегая двух строк, которые дублируют empid» * - Да, это важная вещь указать, и я подтвердил ваш комментарий, но он не изменяет решение самого заданного вопроса. В интересах быть полезным я опубликовал решение, несмотря на возможное недоразумение от имени искателя. – GarethD