在我的数据库中,我有~67 000行,但我有12k个重复行和不同的键。
我想删除重复项并只保存一行。
表名:seb_societe
类似专栏:nom,phone,adress,zip
我尝试了这个,但它不起作用:
DELETE
FROM seb_societe AS T
WHERE T.rowid < ANY (SELECT rowid
FROM seb_societe AS T2
WHERE T.rowid <> T2.rowid
AND T.nom = T2.nom
AND T.address = T2.address);
任何人都可以告诉我为什么我的尝试不起作用,或者如何达到我想要的结果。
答案 0 :(得分:5)
delete
from seb_societe
where exists
(
select *
from
(
select 1
from seb_societe t2
where t2.row_id > row_id
and nom = T2.nom
and address = T2.address
) x1
)
答案 1 :(得分:2)
您可以在加入时使用删除:
delete s
from seb_societe s
join (
select nom,
address,
max(rowid) as max_rowid
from seb_societe
group by nom,
address
) t on s.nom = t.nom
and s.address = t.address
and s.rowid <> t.max_rowid;
答案 2 :(得分:2)
DELETE t1 FROM
seb_societe t1 LEFT JOIN seb_societe t2 ON
t1.nom = t2.nom AND t1.address = t2.address
WHERE t1.row_id < t2.row_id;
首先尝试备份......
这应该留下具有重复项的最高row_id的行。
答案 3 :(得分:1)
DELETE T FROM seb_societe T,seb_societe T2 WHERE T.rowid&lt; T2.rowid AND T.nom = T2.nom AND T.address = T2.address;
答案 4 :(得分:0)
问题解决了。我使用PHP脚本删除重复行:
global $dbh;
$query='SELECT rowid, nom FROM seb_societe GROUP BY `nom`, `address` HAVING COUNT(*) > 1';
$query = $dbh->query($query);
$i = 0;
$retour=array();
while($resultat = $query->fetch()) {
$rowid = $resultat['rowid'];
$suppression = $dbh->exec('DELETE FROM seb_societe WHERE rowid = '.$rowid);
}
之前,我使用外键删除其他表中的所有行。
感谢所有人的回复。