http://yihong.org/?post=416
最近在用友二次開(kāi)發(fā)的過(guò)程中,對(duì)于固定資產(chǎn)模塊生成固定資產(chǎn)卡片時(shí),需要按編號(hào)將不重復(fù)的固定資產(chǎn)卡片顯示出來(lái),用distinct查找的結(jié)果不符合要求(用友的固定資產(chǎn)卡片,隨著固定資產(chǎn)的變動(dòng)會(huì)產(chǎn)生很多條相同編號(hào)不同內(nèi)容的記錄,而我需要的又是最后一次更改的結(jié)果,用distinct就不能滿足要求了)
由于設(shè)計(jì)需要,需要查詢不重復(fù)的記錄值,同類問(wèn)題,想必大家都遇到過(guò),于是乎馬上GOOGLE一下,發(fā)現(xiàn)此類問(wèn)題還挺多,解決方案也不少,仔細(xì)看看。
例如有如下表結(jié)構(gòu)和值
table
fid name sex
1 a 男
2 b 男
3 c 女
4 d 女
5 a 男
6 b 男
方案一:distinct
select distinct name from table
得到結(jié)果:
name
a
b
c
d
實(shí)現(xiàn)效果,那如果要同時(shí)打開(kāi)其它記錄呢?再試試
select distinct name,id from table
測(cè)試沒(méi)什么效果,查下得知,這樣實(shí)際是要name和id字段都重復(fù)才被篩選。繼續(xù)查找可得如下方法:
方案二:group by
select *, count(distinct name) from table group by name
Oracle下測(cè)試失敗,據(jù)說(shuō)MYSQL下通過(guò),不管,繼續(xù)思考....
翻翻書,試試
select min(fid),name,sex from table group by name
成功,現(xiàn)實(shí)如下結(jié)果:
fid name sex
1 a 男
2 b 男
3 c 女
4 d 女
繼續(xù)思考,如果要打開(kāi)所有記錄,不指定字段用(*),貌似這方法就不行了!
select * from table where fid in(Select min(fid) FROM table group by name)
測(cè)試成功
fid name sex
1 a 男
2 b 男
3 c 女
4 d 女
方案三:
本來(lái)已經(jīng)完了,突然想起前幾天在網(wǎng)上查了查詢數(shù)據(jù)中所有某字段不重復(fù)的記錄
select * from table where name in(select name from table group
by name having count(name)=2)
得到如下結(jié)果:
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)
按道理說(shuō)沒(méi)問(wèn)題,大家試試~~
再多的字段都全部現(xiàn)實(shí)。哎,原來(lái)如此簡(jiǎn)單!回顧網(wǎng)上方法distinct,Inner Join等等,麻煩,而且有很大局限性.
總結(jié)如下:
select distinct name from table打開(kāi)不重復(fù)記錄的單個(gè)字段
select * from table where fid in(Select min(fid) FROM table group by
name)打開(kāi)不重復(fù)記錄的所有字段值
select * from table where name in(select name from table group
by name having count(name)=1)打開(kāi)不重復(fù)任意次數(shù)的所有記錄
posted on 2011-05-09 22:22
luis 閱讀(665)
評(píng)論(0) 編輯 收藏 引用