2014-10-28 126 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