Access交流中心

北京 | 上海 | 天津 | 重庆 | 广州 | 深圳 | 珠海 | 汕头 | 佛山 | 中山 | 东莞 | 南京 | 苏州 | 无锡 | 常州 | 南通 | 扬州 | 徐州 | 杭州 | 温州 | 宁波 | 台州 | 福州 | 厦门 | 泉州 | 龙岩 | 合肥 | 芜湖 | 成都 | 遂宁 | 长沙 | 株洲 | 湘潭 | 武汉 | 南昌 | 济南 | 青岛 | 烟台 | 潍坊 | 淄博 | 济宁 | 太原 | 郑州 | 石家庄 | 保定 | 唐山 | 西安 | 大连 | 沈阳 | 长春 | 昆明 | 兰州 | 哈尔滨 | 佳木斯 | 南宁 | 桂林 | 海口 | 贵阳 | 西宁 | 乌鲁木齐 | 包头 |

怎样只删除表中重复数据中的一条,如果数据没有重复的,那么就也删掉。

jie  发表于:2012-12-30 23:23:41  
复制

怎样只删除表中重复数据中的一条,如果数据没有重复的,那么就也删掉。


比如

订单       产品编号        数量

12                a11             1

12                a11             -1

12                a12              1

13                a13              3

13                 a13            -1


删除之后变成

订单       产品编号        数量

12                a11             1

13                 a13            -1



 

Top
煮江品茶 发表于:2012-12-31 11:35:33

需要增加一个id字段,否则用ado记录集来删除。假设增加一个id字段,则分两条语句删除:

delete * from tbname where dcount("*","tbname","订单=" & 订单 & " and 产品编号='" & 产品编号 & "'")=1

delete * from tbname where id<>dmin("id","tbname","订单=" & 订单 & " and 产品编号='" & 产品编号 & "'")



jie 发表于:2012-12-31 17:13:21
高人,我在删除查询里 sql视图下写入了这两句,分别建立了2个查询(以前表里就有个id字段,是自动编号的),但是运行提示未知啊????

煮江品茶 发表于:2012-12-31 17:15:15
看看数据名称和数据类型是否正确

jie 发表于:2013-01-01 12:44:59
高手,我反复查看了,没发现有什么问题啊。请帮我看看吧??????ش˸???


红尘如烟 发表于:2013-01-01 13:39:28

表中要有一个自动编号的ID字段,需要分2步来执行删除查询才行(注意顺序不能乱,必须先执行查询1,再执行查询2):

 

查询1:删除只有一条记录的货号
DELETE FROM 表1 AS X WHERE EXISTS (SELECT 产品编号 FROM 表1 WHERE 产品编号=X.产品编号 GROUP BY 产品编号 HAVING COUNT(1)=1);

查询2:2 删除不只一条记录的货号的第一条记录
DELETE FROM 表1 AS X WHERE ID = (SELECT MIN(ID) FROM 表1 WHERE 产品编号=X.产品编号 GROUP BY 产品编号);

 



dbaseIIIer 发表于:2013-01-01 17:28:21

其实,看你的例子,不知道你有什么逻辑去 删除 或者 保留 重复的 数据!

如果重复了,到底是 保留最后一条,还是 保留第一条?

如果重复超过2条,是只删除 第一条 ?或者 只删除 最后一条?


不管你,全给你了!反正都是很简单一句话的



保留重复的第一条:


delete from 数据表

where id not in (

    select min(id)  from 数据表 group by 订单, 产品标号 having count(id)>1

)



保留重复的最后一条:

delete from 数据表

where id not in (

    select max(id)  from 数据表 group by 订单, 产品标号 having count(id)>1

)



删除重复的第一条(包括没有重复的)

delete from 数据表

where id in (

    select min(id)  from 数据表 group by 订单, 产品标号

)

删除重复的最后一条(包括没有重复的):

delete from 数据表

where id in (

    select max(id)  from 数据表 group by 订单, 产品标号

)






jie 发表于:2013-01-01 20:17:00


非常感谢诸位高人 白忙之中为我解答,非常感谢,祝元旦快乐。

问题还没解决,可能是我表达的不清楚。我重新说一下。


我只把每个订单中产品编码重复的货删掉1行(产品编码重复的货可能会有很多行,不止2行,随便删掉哪一行都可以,不分第一行或者第二行),如果这个订单中有的产品编码没有重复的,那么就把这个产品编码所在的那一行也删掉。

如图,画红圈的都是要删掉的行。

      订单123中a11重复,所以删掉1个a11(删哪一行的a11都可以), 订单123 中a12不重复,把a12所在的那一行也删掉。

      订单124中a12重复,删掉一个a12。

      订单125中a11重复,删掉一个a11,订单125中a13也重复,删掉一个a13

  




黎红军 发表于:2013-01-01 22:03:27

我想大家也都有些郁闷,搞不明白你的需求,如你所说,你需要这些数据做什么呢,或者再怎么利用这些数据呢?

愿闻其详!



jie 发表于:2013-01-02 11:31:21

因为仓库和商店表中的索引字段不能形成一 一对应的关系,也不能形成1对多的关系,所以很难筛选,所以我想把商店中的重复的删掉一项,再把仓库的合计了追加进来,然后再平均。




dbaseIIIer 发表于:2013-01-03 06:08:30
大家都告诉你方法了!你还不懂用的话,就只能收费上门帮你处理了!

dbaseIIIer 发表于:2013-01-04 06:42:29

不好意思,今天才看到你的留言!


再来看看的意思是什么?看你那些 红蓝绿 的 涂鸦?真的是不想看的! 因为没有你的原始数据,要我录入一次来示范,好麻烦!

其实,你是数据库设计的失败,导致,不能一对多,因为这是多对多关系,而恰恰你又没有建这些表,所以难倒自己,难倒大家了!


我不想细看你的失误作品,所以我还是看看你的问题:

怎样只删除表中重复数据中的一条,如果数据没有重复的,那么就也删掉。


我给你的方法 有四个,既然你不介意重复的删掉 哪几条,反正留下一条就可以了,你就选第一个答案吧:

delete from 数据表

where id not in (

    select min(id)  from 数据表 group by 订单, 产品标号 having count(id)>1

)


这里,没有重复的,就删掉了;

有重复的 只保留重复的第一条。


应该对你的问题挺吻合的!

----------------------------------------------------

另外,我想说的是

平均那个数好像没什么用,你只需要处理总数就可以了吧?

仓库的出货 与 商店 的 库存,我都说了是多对多的关系,

意思是,输入一张 仓库出库单,然后选 多个 商店waybill 并且填个 结算数量,

保存前 检查 waybill 所有的 结算数量 的 Sum  不能超过 waybill 商品 的 sum 为合格;

另外, 单个出库单-商品  的  结算数量的 Sum 不能超过 出库单-商品 的 Sum 为合格;

当这两个合格 就能保存。


可能事后 waybill-商品 发生变化,导致 这个结算 不均衡,就用个查询查个偏差出来就行了!



黎红军 发表于:2013-01-05 02:55:58

我也觉得是你数据库基础表的设置问题: 多对多的关系也是可以拆建为一对多的,关键是你的业务是否必须。

一个订单中的每行可以创建一个唯一的ID,发货时每个发货行记录对应相应的订单行ID,那么,你的所有订单行就可以统计相应的发货信息了。发货前的预留也同样。

统计发货数量一般只有数量的合计,还真没听说过再平均的。只有在统计你的次数、1一次合格率等其他业务考核时用到其他的统计函数。

同意楼上总版主的,如果你对保留的行无特殊要求,那么就无所谓了。

 



总记录:12篇  页次:1/1 9 1 :