mysql与oracle去重方案的异同,mysql处于学习阶段不太熟悉,最后有两个解决不了,求大神帮忙补充上

混分小菜鸟 发布于 2015/03/20 17:09
阅读 295
收藏 0
去重查询语句
  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 
    
    多个字段去重  求补充
    
     限制去重范围 求补充

加载中
0
JeffreyLin
JeffreyLin
这个不对吧:

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 

混分小菜鸟
混分小菜鸟
这个我验证过是可以的,还有另一种方法, 但是我觉得没有这个好理解就没写上面
0
混分小菜鸟
混分小菜鸟
感觉还是oracle的简单粗暴,但是现在开始使用mysql,感觉语法难理解了很多,还是必须学习啊
返回顶部
顶部