mysql 数据入库去重_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

);

##问题

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的报错。

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值