MySQL 删除重复记录

阅读更多

用SQL语句,删除掉重复项只保留一条

在几千条记录里,存在着些相同的记录,如何能用SQL语句,删除掉重复的呢 
1、查找表中多余的重复记录,重复记录是根据单个字段(peopleId)来判断

  1.  
    SELECT
  2.  
    *
  3.  
    FROM
  4.  
    people
  5.  
    WHERE
  6.  
    peopleId IN (
  7.  
    SELECT
  8.  
    peopleId
  9.  
    FROM
  10.  
    people
  11.  
    GROUP BY
  12.  
    peopleId
  13.  
    HAVING
  14.  
    count(peopleId) > 1
  15.  
    )

2、删除表中多余的重复记录,重复记录是根据单个字段(peopleId)来判断,只留有rowid最小的记录

  1.  
    DELETE
  2.  
    FROM
  3.  
    people
  4.  
    WHERE
  5.  
    peopleName IN (
  6.  
    SELECT
  7.  
    peopleName
  8.  
    FROM
  9.  
    people
  10.  
    GROUP BY
  11.  
    peopleName
  12.  
    HAVING
  13.  
    count(peopleName) > 1
  14.  
    )
  15.  
    AND peopleId NOT IN (
  16.  
    SELECT
  17.  
    min(peopleId)
  18.  
    FROM
  19.  
    people
  20.  
    GROUP BY
  21.  
    peopleName
  22.  
    HAVING
  23.  
    count(peopleName) > 1
  24.  
    )

3、查找表中多余的重复记录(多个字段)

  1.  
    SELECT
  2.  
    *
  3.  
    FROM
  4.  
    vitae a
  5.  
    WHERE
  6.  
    (a.peopleId, a.seq) IN (
  7.  
    SELECT
  8.  
    peopleId,
  9.  
    seq
  10.  
    FROM
  11.  
    vitae
  12.  
    GROUP BY
  13.  
    peopleId,
  14.  
    seq
  15.  
    HAVING
  16.  
    count(*) > 1
  17.  
    )

4、删除表中多余的重复记录(多个字段),只留有rowid最小的记录

  1.  
    DELETE
  2.  
    FROM
  3.  
    vitae a
  4.  
    WHERE
  5.  
    (a.peopleId, a.seq) IN (
  6.  
    SELECT
  7.  
    peopleId,
  8.  
    seq
  9.  
    FROM
  10.  
    vitae
  11.  
    GROUP BY
  12.  
    peopleId,
  13.  
    seq
  14.  
    HAVING
  15.  
    count(*) > 1
  16.  
    )
  17.  
    AND rowid NOT IN (
  18.  
    SELECT
  19.  
    min( rowid)
  20.  
    FROM
  21.  
    vitae
  22.  
    GROUP BY
  23.  
    peopleId,
  24.  
    seq
  25.  
    HAVING
  26.  
    count(*) > 1
  27.  
    )

5、查找表中多余的重复记录(多个字段),不包含rowid最小的记录

  1.  
    SELECT
  2.  
    *
  3.  
    FROM
  4.  
    vitae a
  5.  
    WHERE
  6.  
    (a.peopleId, a.seq) IN (
  7.  
    SELECT
  8.  
    peopleId,
  9.  
    seq
  10.  
    FROM
  11.  
    vitae
  12.  
    GROUP BY
  13.  
    peopleId,
  14.  
    seq
  15.  
    HAVING
  16.  
    count(*) > 1
  17.  
    )
  18.  
    AND rowid NOT IN (
  19.  
    SELECT
  20.  
    min( rowid)
  21.  
    FROM
  22.  
    vitae
  23.  
    GROUP BY
  24.  
    peopleId,
  25.  
    seq
  26.  
    HAVING
  27.  
    count(*) > 1
  28.  
    )

6.消除一个字段的左边的第一位:

  1.  
     
  2.  
     
  3.  
    UPDATE tableName
  4.  
    SET [ Title ]= RIGHT ([ Title ],( len([ Title ]) - 1))
  5.  
    WHERE
  6.  
    Title LIKE '村%'
  7.  
     

7.消除一个字段的右边的第一位:

  1.  
     
  2.  
     
  3.  
    UPDATE tableName
  4.  
    SET [ Title ]= LEFT ([ Title ],( len([ Title ]) - 1))
  5.  
    WHERE
  6.  
    Title LIKE '%村'
  7.  
     

8.假删除表中多余的重复记录(多个字段),不包含rowid最小的记录

  1.  
    UPDATE vitae
  2.  
    SET ispass =- 1
  3.  
    WHERE
  4.  
    peopleId IN (
  5.  
    SELECT
  6.  
    peopleId
  7.  
    FROM
  8.  
    vitae
  9.  
    GROUP BY
  10.  
    peopleId

可能会遇到You can't specify target table '表名' for update in FROM clause这样的错误,它的意思是说,不能先select出同一表中的某些值,再update这个表(在同一语句中),即不能依据某字段值做判断再来更新某字段的值。

 

1、数据准备

product表数据如下:

MySQL 删除重复记录_第1张图片

 

laptop表数据如下:

MySQL 删除重复记录_第2张图片

 

2、要求:#删除所有不生产打印机厂商生产的笔记本电脑

第一步:对aptop表进行操作

MySQL 删除重复记录_第3张图片

操作没有问题,按照本思路对product表进行操作

MySQL 删除重复记录_第4张图片

产生You can't specify target table '表名' for update in FROM clause错误

 

 

3、问题解决

将SELECT出的结果再通过中间表SELECT一遍,这样就规避了错误。

 

MySQL 删除重复记录_第5张图片

需要注意的是,这个问题只出现于MySQL,MSSQL和Oracle不会出现此问题。

 

你可能感兴趣的:(MySQL 删除重复记录)