SQL删除名称相同的重复行

SQL删除名称相同的重复行,sql,Sql,“我的表”包含名称如下的条目: 12345 A12345 234567 A234567 A99999 我想删除表中存在xxxxx的包含Axxxxx的行。因此,在我的示例中,我想离开: 12345 234567 A99999 但是删除A12345和A234567,因为12345和234567在表中…这将删除Axxxxx中有xxxxx行的所有行: delete from mytable where name in ( select CONCAT('A', name) from m

“我的表”包含名称如下的条目:

12345
A12345
234567
A234567
A99999
我想删除表中存在xxxxx的包含Axxxxx的行。因此,在我的示例中,我想离开:

12345
234567
A99999

但是删除A12345和A234567,因为12345和234567在表中…

这将删除Axxxxx中有xxxxx行的所有行:

delete from mytable
where name in (
    select CONCAT('A', name)
    from mytable
    where name not like 'A%')
)
编辑:
在上一版本中,我的逻辑颠倒了

这将删除Axxxxx的所有行,其中有xxxxx的行:

delete from mytable
where name in (
    select CONCAT('A', name)
    from mytable
    where name not like 'A%')
)
delete from mytable 
where name in (select b.name
  from mytable a
  INNER JOIN mytable b
    on a.name = SubString(b.name, 1, LEN(b.name))
  WHERE Substring(a.name, 0, 1) <> 'A' AND Substring(b.name, 0, 1) = 'A'
    )
编辑: 我在上一个版本中颠倒了逻辑

delete from mytable 
where name in (select b.name
  from mytable a
  INNER JOIN mytable b
    on a.name = SubString(b.name, 1, LEN(b.name))
  WHERE Substring(a.name, 0, 1) <> 'A' AND Substring(b.name, 0, 1) = 'A'
    )
试试这个。你可能不得不抽动子字符串。但你明白了


试试这个。你可能不得不抽动子字符串。但是你明白了。

这就是我的想法:

delete from Data2 where id in (
    select d.id from Data d
    left join Data1 d1 on (d.id = CONCAT('A', d1.id))
    where d1.id is not null
)
你可以玩它

这是一个带有子字符串的查询。。。但我认为效率稍低,你可以稍后告诉我们:

delete from Data where id in (
    select d2.id from Data1 d1
    join Data2 d2 on (d1.id = substring(d2.id, 2))
);
注意:mysql子字符串将要编号的第一个字符视为1而不是0


你可以玩它

这就是我的想法:

delete from Data2 where id in (
    select d.id from Data d
    left join Data1 d1 on (d.id = CONCAT('A', d1.id))
    where d1.id is not null
)
你可以玩它

这是一个带有子字符串的查询。。。但我认为效率稍低,你可以稍后告诉我们:

delete from Data where id in (
    select d2.id from Data1 d1
    join Data2 d2 on (d1.id = substring(d2.id, 2))
);
注意:mysql子字符串将要编号的第一个字符视为1而不是0


你可以玩它

这看起来像是在删除12345而不是12345。@Guvante Thx。我误解了这个问题。我已经交换了答案中的逻辑。看起来您删除的是12345而不是12345。@Guvante Thx。我误解了这个问题。我已经交换了答案中的逻辑。嘿,詹姆斯,记住如果你的问题已经被回答,那么你应该选择一个答案嘿,詹姆斯,记住如果你的问题已经被回答,那么你应该选择一个答案