我有一个带有名称的 table ,其中一些是其他名称的简写,有些是相似但不是的。例如 Michael
和 Mike
是互惠的,但 Uncle Michael
不是。我运行了一个脚本来获得单向或双向匹配,例如
Michael | Mike
Mike | Michael
然而只有
Michael | Uncle Michael
这表明它们不是匹配对。
我正在尝试使用它来删除较短的匹配项(例如 Mike
)。
我有一个 http://sqlfiddle.com/#!9/0ee637/1,我只能找到匹配对,但我不确定现在如何执行 Delete t1
以从所有匹配项中删除找到的记录中较短的记录对。
回答1
从数据库服务器的角度来看,这可能会给您一些见解。我们可以使用 group by
子句对名称对中定义的名称进行分组。例如“迈克”和“迈克尔”。然后我们计算结果集中不同名称的数量。在存在多个不同名称的情况下,我们删除较短的名称。否则不删除任何内容,因为我们可能希望保留仅存在 1 个不同的名称。
delete from Names where exists
(
select count(*) from
(select name from Names where (name='Michael' or name='Mike') group by name ) t
having count(*) >1
)
and name='Mike'
;