当前位置:   article > 正文

【sql学习】LeetCode之196. Delete Duplicate Emails_sql write a sql query to delete all duplicate emai

sql write a sql query to delete all duplicate email entries in a table named

Write a SQL query to delete all duplicate email entries in a table named Person, keeping only unique emails based on its smallest Id.

  1. +----+------------------+
  2. | Id | Email |
  3. +----+------------------+
  4. | 1 | john@example.com |
  5. | 2 | bob@example.com |
  6. | 3 | john@example.com |
  7. +----+------------------+
  8. Id is the primary key column for this table.

For example, after running your query, the above Person table should have the following rows:

  1. +----+------------------+
  2. | Id | Email |
  3. +----+------------------+
  4. | 1 | john@example.com |
  5. | 2 | bob@example.com |
  6. +----+------------------+

 

别人的代码:

Approach: Using DELETE and WHERE clause [Accepted]

Algorithm

By joining this table with itself on the Email column, we can get the following code.

  1. SELECT p1.*
  2. FROM Person p1,
  3. Person p2
  4. WHERE
  5. p1.Email = p2.Email
  6. ;

Then we need to find the bigger id having same email address with other records. So we can add a new condition to the WHERE clause like this.

  1. SELECT p1.*
  2. FROM Person p1,
  3. Person p2
  4. WHERE
  5. p1.Email = p2.Email AND p1.Id > p2.Id
  6. ;

As we already get the records to be deleted, we can alter this statement to DELETE in the end.

MySQL

  1. DELETE p1 FROM Person p1,
  2. Person p2
  3. WHERE
  4. p1.Email = p2.Email AND p1.Id > p2.Id

解释:

https://leetcode.com/problems/delete-duplicate-emails/discuss/55553/Simple-Solution 

 

方法二:使用中间表

  1. delete from Person where id not in(select min(id) as id from Person group by email)

you will be noted " You can't specify target table 'Person' for update in FROM clause ",
The solution is using a middle table with select clause:

  1. delete from Person where id not in(
  2. select t.id from (
  3. select min(id) as id from Person group by email
  4. ) t
  5. )

小结:

1)min()的用法

2)使用中间表避免“You can't specify target table 'Person' for update in FROM clause

      因为mysql中,不能先select一个表的记录,再按此条件进行更新和删除同一个表的记录。

      解决办法是,将select得到的结果,再通过中间表select一遍,这样就规避了错误,这个问题只出现于mysql,mssql和oracle不会出现此问题。

3)group by的用法

 

 

声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop】
推荐阅读
相关标签
  

闽ICP备14008679号