我正在寻找sql代码,将删除重复的地方,重复被定义为平等的两个特定领域

pgccezyw  于 2021-06-20  发布在  Mysql
关注(0)|答案(3)|浏览(313)

我有一个mysql数据库,有5个字段。有两个关键字段,cfield1和cfield2。如果对于任何两个条目,cfield1的值是相同的,cfield2的值也是相同的,那么我想删除这两个条目中的一个——不管是哪个条目。
如果有三个是相同的,我只想保留1和删除其余的。
我假设首先要对cfield1和cfield2上的db进行排序,但我不确定其余的编码应该是什么。

e4eetjau

e4eetjau1#

必须同时使用count(*)和group by:

select count (*),DuplicateField from table
group by  DuplicateField
having count (*)>1

因此,您将获得记录。如果你想删除,我可以举个例子告诉你:

select 
    'RepetedRows',
    SA.Saleref,
    MIN(CAST(SA.SaleAdditionID  as varchar(100)) ),
    'DELETE sms.tblsaleadditions    WHERE SaleAdditionID = ''' + MIN(CAST(SA.SaleAdditionID as varchar(100)) ) + ''''
    --select * 
from 
    sms.tblsaleadditions    SA
inner join (
    select
        saleref,
        additionref,
        count(*)    N,
        SUM(AdditionAmount) nn
    from 
        sms.tblsaleadditions
    group by 
        saleref,
        additionref
    having count(*) > 1
    ) V ON SA.saleref = V.Saleref and SA.additionref = V.additionref 
group by 
    SA.Saleref

现在您可以复制所有delete语句并运行它们。

vd8tlhqk

vd8tlhqk2#

在mysql查询中这是什么?我们有这个要求,但是现有的数据库是mysql。

uidvcgyl

uidvcgyl3#

让我假设你有另一个专栏,比如 col3 --可以区分重复行的。然后你可以做:

delete t
    from t t join
         (select cfield1, cfield2, min(col3) as min_col3
          from t
          group by cfield1, cfield2
         ) tt
         using (cfield1, cfield2)
    where t.col3 > tt.min_col3;

如果没有这样的列,那么我建议创建一个新表。下面使用了mysql的一个特性,这是一个非常不鼓励使用的特性,但是它应该做你想做的事情:

create table temp_t as
    select t.*
    from t
    group by col1, col2;

truncate table t;  -- be very careful here, copy the data somewhere else first!

insert into t
    select *
    from temp_t;

相关问题