mysql数据库去重

问题

mysql数据库表osc_table_a中出现了重复记录,需要通过sql来去重,仅留下最早插入的记录。

表osc_table_a:

id     row1     row2    row3

1      123        abc     *****

2      123        def     *****

3      123        abc     *****

4      456        xyz     *****  

5      456        xyz     *****

去重结果
id row1 row2 row3

1      123        abc     *****

2      123        def      *****

4      456        xyz      *****

完整sql


DELETE t FROM osc_table_a t WHERE
(
osc_table_a.row1,
osc_table_a.row2
)IN(
SELECT a.row1, a.row2 FROM(
        SELECT * FROM osc_table_a tmp1 GROUP BY tmp1.row1, tmp1.row2 HAVING COUNT(tmp1.id)> 1
 ) a
)
AND t.id NOT IN(
SELECT b.id FROM (
        SELECT MIN(tmp2.id) id FROM osc_table_a tmp2 GROUP BY tmp2.row1, tmp2.row2 HAVING COUNT(tmp2.id)> 1
) b
);

问题

  1. mysql中DELETE使用别名问题

    如果

    DELETE t FROM osc_table_a t WHERE......
    

    写为

    DELETE FROM osc_table_a t WHERE......
    

    会报语法错误

    * SELECT * FROM osc_table_a b;(正确,可以使用表别名)
    * DELETE FROM osc_table_a b;(错误)
    * DELETE b FROM osc_table_a b;(正确)
    
  2. [Err] 1093 - You can't specify target table 'osc_table_a' for update in FROM clause

    如果去掉 SELECT a.row1, a.row2 FROM(……)a 或者 SELECT b.id FROM (…..)b的报错。

    作用和将查询结果先存入临时表,然后取出来是一样的效果。

你可能感兴趣的:(mysql数据库去重)