zoukankan      html  css  js  c++  java
  • mysql删除重复记录并且只保留一条

    mysql删除重复记录并且只保留一条(deptno id,dname 名字)

    a. 第一种方法:

    根据depno来判断,除了rowid最小的一个

    SELECT
    	*
    FROM
    	dept
    WHERE
    	dname IN (
    		SELECT
    			dname
    		FROM
    			dept
    		GROUP BY
    			dname
    		HAVING
    			COUNT(1) > 1
    	)
    AND deptno NOT IN (
    	SELECT
    		MIN(deptno)
    	FROM
    		dept
    	GROUP BY
    		dname
    	HAVING
    		COUNT(1) > 1
    )
    

    上面这种写法正确,但是查询的速度太慢,可以试一下下面这种方法:

    b. 第二种方法:(删除只是将select改为delete)

    根据dname分组,查找出deptno最小的。然后再查找deptno不包含刚才查出来的。这样就查询出了所有的重复数据(除了deptno最小的那行)

    SELECT *
    FROM
    	dept
    WHERE
    	deptno NOT IN (
    		SELECT
    			dt.minno
    		FROM
    			(
    				SELECT
    					MIN(deptno) AS minno
    				FROM
    					dept
    				GROUP BY
    					dname
    			) dt
    
    	)
    

    总结:

    其实上面的方法还有很多需要优化的地方,如果数据量太大的话,执行起来很慢,可以考虑加优化一下:

    • 在经常查询的字段上加上索引
    • 将*改为你需要查询出来的字段,不要全部查询出来
    • 小表驱动大表用IN,大表驱动小表用EXISTS。IN适合的情况是外表数据量小的情况,而不是外表数据大的情况,因为IN会遍历外表的全部数据,假设a表100条,b表10000条那么遍历次数就是100*10000次,而exists则是执行100次去判断a表中的数据是否在b表中存在,它只执行了a.length次数。至于哪一个效率高是要看情况的,因为in是在内存中比较的,而exists则是进行数据库查询操作的
  • 相关阅读:
    编译原理
    C++的RTTI
    静态加载dll的问题
    COM编程中的接口查询QueryInterface的实现原理
    com学习笔记(2)基本的com接口QueryInterface的实现
    如何从DLL中生成LIB文件
    CMAP原理及其在MFC中的实现(MAP模板没有顺序遍历的功能)
    多态性vptrvtable
    技术网站
    垃圾事务
  • 原文地址:https://www.cnblogs.com/caibaotimes/p/14297921.html
Copyright © 2011-2022 走看看