sql not in问题

access数据库文件只有一个表A,有60000多条记录结构如下:ID地址地区1厦门华东2泉州华东3厦门华东4深圳华南5深圳华南6厦门华东................... access数据库文件只有一个表A,有60000多条记录
结构如下:
ID 地址 地区
1 厦门 华东
2 泉州 华东
3 厦门 华东
4 深圳 华南
5 深圳 华南
6 厦门 华东
.....................
因为存在重复记录,比如 ID:1,3,4,5
所以使用以下语句执行删除重复的记录,保留一条,但发现 NOT IN 的效率很慢,居然要等上10多分钟,怎办?有没有更好的办法

delete from cidz where id NOT in (select max(id) from cidz group by 地址)
展开
 我来答
hit_lubin
2011-04-29 · TA获得超过7889个赞
知道大有可为答主
回答量:1554
采纳率:100%
帮助的人:2004万
展开全部
NOT IN速度当然很慢,因为这样会存在两个全表检索的情况,使用NOT EXISTS会快很多。
delete from t_b where exists (select 1 from t_b a where isnull(a.cost,0) > isnull(t_b.cost,0) and a.cost <> t_b.cost)
DELETE FROM CIDZ WHERE EXISTS (SELECT 1 FROM CIDZ A WHERE A.ID > CIDZ.ID)
---------这个删除之后,会只剩下这个表中ID最大的一行,没有别的连接条件了么?如果这么已删除,表中只剩下一行了,我觉得你的意思是不是只留下每个地址分组后ID最大的一行啊?
启帆信息
2024-11-19 广告
启帆信息是英伟达中国区代理商,原厂授权代理,提供全面的软件技术解决方案以及NVIDIA以太网产品、交换机等产品,欢迎前来咨询!... 点击进入详情页
本回答由启帆信息提供
百度网友66a8d48e5
2011-04-29 · TA获得超过7687个赞
知道大有可为答主
回答量:3002
采纳率:12%
帮助的人:3871万
展开全部
这个效率肯定是很慢的,因为不单单是not in效率较低,group by效率也高不到哪儿去!

这种情况可以看出是由于设计表时进行了错误的分析,导致出现了大量的冗余。
id->地址.id->地区,地址->地区
这是函数依赖关系,也就是说如果id是主键的情况下,存在者有属性对非主属性的依赖,这张表不符合2NF,所以会出现大量的冗余,而这个才是效率低下的真正原因!也就是说你的语句上的只是效率问题,而数据库才是执行慢的真正原因!如果合理的数据库,存在1K左右的记录,就算你还使用group by与not in也不会等到10分钟的!
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

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

类别

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

说明

0/200

提交
取消

辅 助

模 式