天天看點

SQL不重複記錄

由于設計需要,需要查詢不重複的記錄值,同類問題,想必大家都遇到過,于是乎馬上GOOGLE一下,發現此類問題還挺多,解決方案也不少,仔細看看。

例如有如下表結構和值

table

fid   name  sex

1     a      男

2     b      男

3     c      女

4     d      女

5     a      男

6     b      男

方案一:distinct

select distinct name from table

得到結果:

name

a

b

c

d

實作效果,那如果要同時打開其它記錄呢?再試試

select distinct name,id from table

測試沒什麼效果,查下得知,這樣實際是要name和id字段都重複才被篩選。繼續查找可得如下方法:

方案二:group by

select *, count(distinct name) from table group by name

Oracle下測試失敗,據說MYSQL下通過,不管,繼續思考....

翻翻書,試試

select min(fid),name,sex from table group by name

成功,現實如下結果:

fid   name  sex

1     a      男

2     b      男

3     c      女

4     d      女

繼續思考,如果要打開所有記錄,不指定字段用(*),貌似這方法就不行了!

select  * from table where fid in(Select min(fid) FROM table group by name)

測試成功

fid   name  sex

1     a      男

2     b      男

3     c      女

4     d      女

方案三:

本來已經完了,突然想起前幾天在網上查了查詢資料中所有某字段不重複的記錄

select   *   from   table   where   name in(select   name   from   table   group   by   name     having   count(name)=2)

得到如下結果:

fid   name  sex

1     a      男

2     b      男

5     a      男

6     b      男

以此類推:

select   *   from   table   where   name in(select   name   from   table   group   by   name     having   count(name)=1)

按道理說沒問題,大家試試~~

再多的字段都全部現實。哎,原來如此簡單!回顧網上方法distinct,Inner   Join等等,麻煩,而且有很大局限性.

總結如下:

select distinct name from table打開不重複記錄的單個字段

select  * from table where fid in(Select min(fid) FROM table group by name)打開不重複記錄的所有字段值

select   *   from   table   where   name in(select   name