2014-10-28 6 views
0

Под этим я имею в виду оставляя дубликаты записейКак выбрать только уникальные записи

Например

ID NAME 
1 a 
2 a 
3 b 
4 b 
5 c 

Желаемая выход.

5 C Только

Я устал пытаться это. Поэтому я не думаю, что у меня нет разумного кода для вставки здесь.

+0

@UncleIroh похоже, что ему нужны только записи, которые не дублируются. Так что 'distinct' здесь неприменим. –

+0

@Jonno_FTW да, извините, удалил мой комментарий, как только я понял, что :) –

ответ

1

Вот еще один возможный путь:

select min(id), name from table group by name having count(*) = 1 
+0

, пока это работает для его набора примеров, в общем смысле я думаю, что min() не будет работать. –

+0

@UncleIroh В этом случае он должен, потому что мы ограничиваем запрос только уникальными записями (т. Е. 'Count count (*) = 1'), который * гарантирует *, что каждая группа будет иметь только одну запись и, следовательно, Функция min() 'не влияет на результаты (поскольку для каждой группы есть только один набор). Единственная причина в том, что в запросе есть «группа», а столбец «id» не сгруппирован, поэтому он должен находиться внутри агрегатной функции. – Ruslan

+0

Кажется, что он работает без мин. Тем не менее, я должен хорошо протестировать. – Narayan

1

Вот один из способов:

select t.* 
from table t 
where not exists (select 1 
        from table t2 
        where t2.name = t.name and t2.id <> t.id 
       ); 

Вот еще один способ:

select t.* 
from table t join 
    (select name, count(*) as cnt 
     from table t 
     group by name 
     having cnt = 1 
    ) tt 
    on tt.name = t.name; 
+0

Я думаю, что вы хотите t2.id <> t.id в вашем первом примере –

+0

@UncleIroh прав, вам нужно проверить, когда идентификаторы не равны, иначе первый один не возвращает никаких результатов. – AdamMc331

+1

@ McAdam331. , , Исправлена. –

-1
select a.* 
from table a 
left join table b on a.name = b.name and a.id <> b.id 
where b.id is null; 
+0

Что случилось с этим? –

0

Я думаю, что самый чистый путь к сделайте это, чтобы выбрать имя и идентификатор для каждой строки, grou p по имени и фильтровать только значения, у которых есть COUNT (*) из 1. Это означает, что любые строки, которые имеют уникальное имя, исключаются.

Это будет выглядеть следующим образом:

SELECT id, name 
FROM myTable 
GROUP BY name 
HAVING COUNT(*) = 1; 

Я не могу заставить SQL работать, но проверить это в MySQL Workbench:

enter image description here

0

Вот еще один способ сделать это :

SELECT * FROM table AS A 
    WHERE (SELECT COUNT(*) FROM table AS T 
      WHERE T.NAME = A.NAME) = 1 
Смежные вопросы