posts - 195,  comments - 30,  trackbacks - 0

http://yihong.org/?post=416
最近在用友二次开发的过程中,对于固定资产模块生成固定资产卡片时,需要按编号将不重复的固定资产卡片显示出来,用distinct查找的结果不符合要求(用友的固定资产卡片,随着固定资产的变动会产生很多条相同编号不同内容的记录,而我需要的又是最后一次更改的结果,用distinct就不能满足要求了)

由于设计需要,需要查询不重复的记录值,同类问题,想必大家都遇到过,于是乎马上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   from   table   group 
  by   name     having   count(name)=1)打开不重复任意次数的所有记录

posted on 2011-05-09 22:22 luis 阅读(640) 评论(0)  编辑 收藏 引用

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理


<2009年7月>
2829301234
567891011
12131415161718
19202122232425
2627282930311
2345678

常用链接

留言簿(3)

随笔分类

随笔档案

文章分类

文章档案

友情链接

搜索

  •  

最新评论

阅读排行榜

评论排行榜