2014-10-28 114 views
0

我的意思是留下任何重复的记录如何只选择唯一的记录

例如

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

所需的输出。

仅限5 c

我厌倦了试试这个。所以我不认为我没有任何合理的代码粘贴在这里。

+0

@UncleIroh看起来他只想要不重复的记录。所以'独特'在这里是不适用的。 – 2014-10-28 01:14:39

+0

@Jonno_FTW是啊对不起删除我的评论一旦我意识到:) – 2014-10-28 01:18:19

回答

1

这里是另一个可能的方式:

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

虽然这适用于他的示例集,但在一般意义上,我认为min()将不起作用。 – 2014-10-28 01:15:43

+0

@UncleIroh在这种情况下,它应该,因为我们只限于查询唯一的记录(即'有count(*)= 1'子句),它*保证*每个组只有一个记录,因此' min()'函数对结果没有影响(因为每个组只有一组)。它存在的唯一原因是因为在查询中有一个“group by”,而“id”列没有分组,所以它需要在一个聚合函数中。 – Ruslan 2014-10-28 01:16:50

+0

它似乎没有最小的工作。尽管如此,我还是得好好考验。 – Narayan 2014-10-28 01:20:07

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 – 2014-10-28 01:14:40

+0

@UncleIroh是正确的,你需要检查时,ids是不相等的,否则第一个一个不会返回任何结果。 – AdamMc331 2014-10-28 01:32:05

+1

@ McAdam331。 。 。固定。 – 2014-10-28 01:33:03

-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

这是怎么回事? – 2014-10-28 16:00:58

0

我认为最干净的方式这样做是为每一行,分组选择名称和ID p,并且只对具有COUNT(*)为1的值进行过滤。这意味着排除具有不唯一名称的任何行。

它应该是这样的:

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

我不能让SQL工作,但验证了这一点在MySQL工作台:

enter image description here

0

这里是另一种方式来做到这一点:

SELECT * FROM table AS A 
    WHERE (SELECT COUNT(*) FROM table AS T 
      WHERE T.NAME = A.NAME) = 1