求SQL语句 过滤重复记录 只显示一条

假如有一个表为biao字段为id(自动编号)namenumber1张三12张三23李四14李四25王五1过滤字段name重复值并且选number最大值然后再按ID降序排列... 假如有一个表为 biao
字段为
id (自动编号) name number
1 张三 1
2 张三 2
3 李四 1
4 李四 2
5 王五 1

过滤字段name重复值并且选number最大值 然后再按ID降序排列!
测试不成功!

根据二楼回答 又测试了 测试成功了!
但问题又来了 加order by id desc后查询速度就很慢!
若无 则又变为升序排列。这如何解决呢?

三楼 测试不成功 index 是在数据库建立索引吗?我是ACCESS自动有索引的呀!
展开
 我来答
tjrmgs
2011-02-09 · TA获得超过5765个赞
知道大有可为答主
回答量:2161
采纳率:94%
帮助的人:1044万
展开全部
挺有趣的问题。下面SQL代码经在ACCESS上对原表(biao)记录可能出现的多种情况都测试成功,可以实现你的过滤和排序要求:

SELECT t1.*
FROM (SELECT Max(biao.id) AS id,biao.name,Max(t.zdz) as 最大值
FROM biao INNER JOIN (SELECT biao.name, Max(biao.number) AS ZDZ FROM
biao GROUP BY biao.name)t
ON (biao.name=t.name) and (biao.number=t.ZDZ)
GROUP BY biao.name)t1
ORDER BY t1.id DESC;

代码思路要比上面SQL代码复杂很多,我晚些时候再作补充说明。
现在说明如下:
你的问题的难点在于既要排除重复值又要使用自动ID排序。一般来讲消除重复值使用DISTINCT关键字或分组汇总方法非常方便,但问题是如果输出记录中包含自动ID字段,由于原表中每一条记录的自动ID值都是唯一的,这会导致DISTINCT关键字或分组汇总方法无效,而剔除自动ID字段后虽然可以得到唯一记录,但是唯一记录失去了与自动ID的关联而无法按自动ID字段进行准确排序。
前面的多位网友对你的问题做出了认真的答复,但是解决的不尽完善。为了解决这个矛盾我上面的SQL代码采用了三重嵌套查询加以解决:
第一层(最底层子查询表)对原表(biao)用分组方法获取无name重复值和其number最大值的子查询表并取表别名"t“ (SELECT biao.name, Max(biao.number) AS ZDZ FROM biao GROUP BY biao.name)t ;
第二层 (第二重子查询表取表别名"t1“)用原表与第一层子查询表"t"进行内连接找查出含有自动ID字段和number字段最大值的那些记录,请注意这时查询出来的记录都含有number最大值,但是name字段仍可能含有重复值,怎么办?这里第二次用name字段进行分组并用Max函数找出各组中自动ID字段值最大的那条记录。到此,我们已经过滤字段name重复值并且选取number 最大值并得到与记录准确对应的自动ID值,自动ID降序排序任务交由第三层查询实施(若在此时实施会导致第二层查询失败)
(SELECT Max(biao.id) AS id,biao.name,Max(t.zdz) as 最大值
FROM biao INNER JOIN t
ON (biao.name=t.name) and (biao.number=t.ZDZ)
GROUP BY biao.name)t1;
第三层(最外重子查询)最后对第二层子查询表" ti "用ID字段进行降序排序得到最终结果集。
SELECT t1.* FROM t1 ORDER BY t1.id DESC

说些题外话,为了提高效率建议为原表的name字段添加索引,不过即使如此,你这种过滤排序操作的系统开销其实还是挺大的,如果你的原表中存有大量的数据,例如数万条记录以上情况更是如此。如无必要,不建议用自动ID排序,以便减小数据库系统负荷或将这种过滤排序操作分散到各个终端系统用编程的方式实现上述目的。

对lxf967341答案的评价:
该方法的确非常简洁,但是有一个小小的缺陷,那就是查询得到的maxid与实际id不一定准确匹配,会导致排序有时会有偏差。另外直接用maxid排序数据库jet引擎可能无法识别,应取别名后再排序,例如order by 别名.maxid desc
偏差举例:
id (自动编号) name number
1 张三 1
2 张三 2
3 李四 1
4 李四 2
5 王五 1
6 张三 1

过滤排序后的结果为
id (自动编号) name 最大值
6 张三 2
5 王五 1
4 李四 2

准确的过滤排序结果应该为如下
id (自动编号) name 最大值
5 王五 1
4 李四 2
2 张三 2

这就是我之前没有采用这种简洁方法的原因。当然如果能接受这种小缺陷的话,这仍然不失为一种好的选择。
willyyw
2011-02-01 · TA获得超过652个赞
知道小有建树答主
回答量:486
采纳率:0%
帮助的人:407万
展开全部
ACCESS索引也需要手工设置:进入表的设计,常规中有一项是索引
你把ID,NUMA,NUMBER建立INDEX会提高运行速度
SQL语句如下:查了下资料,只有用嵌套SQL了:
select b.* from test b,
(SELECT test.name, Max(test.number) AS mynumber
FROM test
GROUP BY test.name) c
where b.name=c.name and b.number=c.mynumber
ORDER BY b.id DESC;
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
xpopz
2011-01-30
知道答主
回答量:1
采纳率:0%
帮助的人:0
展开全部
willyyw 代码确实有问题,“First()” 和 “Max() ”连用,并没有关联起来,导致显示的只是最大的number 和第一个id 。

速度慢的问题跟Access 本身有关,它本来就不适合管理稍大容量的数据。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
lxf967341
2011-02-09
知道答主
回答量:11
采纳率:0%
帮助的人:7.7万
展开全部
select max(id)as maxid ,name,max(number) as maxnumber from biao group by name order by maxid desc
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
feixianxxx
推荐于2016-04-21 · TA获得超过2202个赞
知道大有可为答主
回答量:1273
采纳率:100%
帮助的人:1759万
展开全部
select *
from biao b
where not exists(select * from biao where b.name=name and b.number<number)
order by id desc
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(4)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式