MySQL中删除重复数据只保留一条

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

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

SELECT
*
FROM
people
WHERE
peopleId IN (
SELECT
peopleId
FROM
people
GROUP BY
peopleId
HAVING
count(peopleId) > 1
)

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

DELETE
FROM
people
WHERE
peopleName IN (
SELECT
peopleName
FROM
people
GROUP BY
peopleName
HAVING
count(peopleName) > 1
)
AND peopleId NOT IN (
SELECT
min(peopleId)
FROM
people
GROUP BY
peopleName
HAVING
count(peopleName) > 1
)

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

SELECT
*
FROM
vitae a
WHERE
(a.peopleId, a.seq) IN (
SELECT
peopleId,
seq
FROM
vitae
GROUP BY
peopleId,
seq
HAVING
count(*) > 1
)

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

DELETE
FROM
vitae a
WHERE
(a.peopleId, a.seq) IN (
SELECT
peopleId,
seq
FROM
vitae
GROUP BY
peopleId,
seq
HAVING
count(*) > 1
)
AND rowid NOT IN (
SELECT
min(rowid)
FROM
vitae
GROUP BY
peopleId,
seq
HAVING
count(*) > 1
)

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

SELECT
*
FROM
vitae a
WHERE
(a.peopleId, a.seq) IN (
SELECT
peopleId,
seq
FROM
vitae
GROUP BY
peopleId,
seq
HAVING
count(*) > 1
)
AND rowid NOT IN (
SELECT
min(rowid)
FROM
vitae
GROUP BY
peopleId,
seq
HAVING
count(*) > 1
)

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

UPDATE tableName
SET [ Title ]= RIGHT ([ Title ],(len([ Title ]) - 1))
WHERE
Title LIKE ‘村%’

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

UPDATE tableName
SET [ Title ]= LEFT ([ Title ],(len([ Title ]) - 1))
WHERE
Title LIKE ‘%村’

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

UPDATE vitae
SET ispass =- 1
WHERE
peopleId IN (
SELECT
peopleId
FROM
vitae
GROUP BY
peopleId)

上述方法在MySQL中会报错 You can’t specify target table for update in FROM clause
mysql中You can’t specify target table for update in FROM clause错误的意思是说,不能先select出同一表中的某些值,再update这个表(在同一语句中)。 例如下面这个sql:
复制代码 代码如下:

delete from tbl where id in
(
select max(id) from tbl a where EXISTS
(
select 1 from tbl b where a.tac=b.tac group by tac HAVING count(1)>1
)
group by tac
)
改写成下面就行了:
复制代码 代码如下:

delete from tbl where id in
(
select a.id from
(
select max(id) id from tbl a where EXISTS
(
select 1 from tbl b where a.tac=b.tac group by tac HAVING count(1)>1
)
group by tac
) a
)
也就是说将select出的结果再通过中间表select一遍,这样就规避了错误。注意,这个问题只出现于mysql,mssql和oracle不会出现此问题。
项目里用到是这样写的
DELETE
FROM
issue
WHERE
gatherUrl in (
SELECT a.gatherUrl from(
SELECT
gatherUrl
FROM
issue

    GROUP BY
        gatherUrl
    HAVING
        COUNT(gatherUrl) > 1
)a )

AND id NOT IN (
SELECT b.id from (
SELECT MIN(id) id from issue

GROUP BY
gatherUrl
HAVING
COUNT(gatherUrl) > 1
)b )

亲测可以用的sql
DELETE t.* FROM tr_org t WHERE t.id IN ( SELECT id FROM(
SELECT r.id
FROM
tr_org r
WHERE
(
r.uid,
r.role_code,
r.data_code
) IN
(SELECT
uid,
role_code,
data_code
FROM
tr_org
GROUP BY
uid,
role_code,
data_code
HAVING
count(*) > 1)

AND id NOT IN (SELECT MIN(id) FROM tr_org GROUP BY uid,
role_code,
data_code
HAVING
count(*) > 1)
)AS b )

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大鹏小站

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值