2
回答
mysql与oracle去重方案的异同,mysql处于学习阶段不太熟悉,最后有两个解决不了,求大神帮忙补充上
终于搞明白,存储TCO原来是这样算的>>>   
去重查询语句
  oracle:   select * from table1 a where rowid in (select max(rowid) from table1 b where a.id = b.id)
 mysql:  select a.id,* from table1 a group by a.id

查询重复的语句
oracle:select * from table1 a where rowid not in (select max(rowid) from table1 b where a.id = b.id)

mysql: SELECT * FROM table1 a LEFT JOIN(
                SELECT id FROM table1 GROUP BY name,value
            )b ON a.id=b.id
            WHERE b.id IS   NULL 

        或者
        SELECT *  FROM table1  WHERE id IN
            (SELECT id   FROM table1   GROUP BY id  HAVING COUNT(id ) > 1)
        

注:在oracle与mysql中 group by 的用法存在很大差异,在oracle中group by 通常被用来数据分组,并进行统计
例如:
    select * from table1 a group by a.id
    这个语句在orcale中是执行错误的,group by 要求明确 * 所代表的的内容,并且必须写在group by中
    也就是它的作用是分组统计,而不是用来去重的

    该语句在mysql中的意思是查询表table1中的所以记录,并根据id进行分组去重。

删除重复记录的语句,重点比较下面三个维度
即:单id过滤,多个字段去重,限制去重范围
ORCALE:
    单id过滤
    delete from table1 a where rowid not in (
            select max(rowid) from table1 b where a.id = b.id)
    多个字段去重
    delete from table1 a where rowid not in (
            select max(rowid) from table1 b where a.id = b.id and a.id1=b.id1)
    限制去重范围
    delete from table1 a where rowid not in (
            select max(rowid) from table1 b where a.id = b.id and a.id1=b.id1 and b.type=1)
    and a.type = 1

MYSQL:
    单id过滤
    DELETE a
    FROM table1 a LEFT JOIN(
        SELECT (id) FROM table1 GROUP BY id
    )b ON a.id=b.id
    WHERE b.id IS  NULL 
    
    多个字段去重  求补充
    
     限制去重范围 求补充

举报
顶部