##问题
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
);
##问题
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;(正确)
[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的报错。
作用和将查询结果先存入临时表,然后取出来是一样的效果。