在数据库中查找潜在的重复名称

时间:2019-03-12 21:40:06

标签: sql-server

我在SQL Server数据库中有两个表:

Table: People
Columns: ID, FirstName, LastName

Table: StandardNames
Columns: Nickname, StandardName

当StandardName为Richard时,示例昵称将为Rick,Rich,Richie。

我想在“人员”表中找到重复的联系人,但是用标准名称替换任何昵称。 IE:有时我有Rich Smith,其他人是People表中的Richard Smith。这可能吗?我意识到可能是同一张表的多个联接,但无法弄清楚如何开始。

2 个答案:

答案 0 :(得分:0)

您可以通过加入来标准化名称,并计算出现的次数。提取ID有点麻烦,但也很有可能。我建议采取以下措施-使用case表达式查找具有标准名称的联系人,如果您没有此名称,则只需获取第一个重复项的ID:

SELECT    COALESCE(MIN(CASE FirstName WHEN StandardName THEN id END), MIN(id)),
          StandardName,
          LastName,
          COUNT(*)
FROM      People p
LEFT JOIN StandardNames s ON FirstName = Nickname AND 
GROUP BY  StandardName, LastName

答案 1 :(得分:0)

首先,您需要确定People表中有多少重复项...

SELECT p.FirstName, COUNT(*)
FROM People AS p
INNER JOIN StandardNames AS sn 
   ON CHARINDEX(sn.Nickname, p.FirstName) > 0 OR
      CHARINDEX(sn.Nickname, p.LastName) > 0
GROUP BY p.FirstName
HAVING COUNT(*) > 1

这只是为了了解您要查找的与“姓氏”和“姓氏”列中可能存在的昵称相关的哪些数据(作为通配符搜索)。

如果您对找到的项目感到满意,请在查询上进行扩展以更新值。 假设您想将Firstname更改为Standardname ...

UPDATE p2
SET p2.FirstName = p2.Standardname
FROM
(SELECT p.ID, sn.StandardName
FROM People AS p
INNER JOIN StandardNames AS sn 
   ON CHARINDEX(sn.Nickname, p.FirstName) > 0 OR
      CHARINDEX(sn.Nickname, p.LastName) > 0) AS a
INNER JOIN People AS p2 ON p2.ID = a.ID

因此,这显然会根据上面的查询找到所有具有匹配项的人员ID,并将通过将FirstName替换为StandardName来更新People表。

但是,由于您的问题的限制,与此相关的问题。

  • StandardNames表应具有其自己的ID字段。所有表都应有一个ID列作为其主表。那只是我的看法。
  • 这仅适用于使用CHARINDEX()函数匹配的数据。您真正需要的是根据“声音”或与昵称的相似性找到的东西。检出SOUNDEX()函数,然后从那里应用逻辑。
  • 这是假设您上面的ID是唯一的!

祝你好运