查询数据库以根据多列

时间:2017-07-25 15:09:19

标签: sql sql-server

我在我的数据库中有一个表,我有大约100k客户端和一个错误的系统已经存在很长一段时间我们刚刚发现我们可能有数千个重复记录,不应该有重复。

这是表格的基本结构......

ClientID         FName           LName           DOB          SysEMID
----------------------------------------------------------------------
123              Janette         Marukan         1/2/1990     111111S
478              Jannete         Maruckan        1/2/1990     111111S

这些并非系统中的所有字段,但我的目标是能够在搜索查询中使用上面的列。因此,我试图获取名字和姓氏的前两个或三个字母,DOB以及SysEMID,并查找可能重复的所有记录。

从表中可以看出,我有两个客户端,但它们的名称略有不同 - 实际上两个客户端都是相同的,但它们在系统中保存为两个。有没有办法让我以某种方式查询整个表并找到它?

我真的没有一个特定的客户端 - 它更像是一种通用的查询,向我展示可能重复的客户端,使用相同的2或3个字母的名字,姓氏和DOB作为初学者?

4 个答案:

答案 0 :(得分:2)

您将使用窗口函数:

select t
from (select t.*,
             count(*) over (partition by left(fname, 2), left(lname, 2), dob, sysemid) as cnt
      from t
     ) t
where cnt > 1
order by sysemid, dob, fname, lname;

这也可能是soundex()实际上有用的极少数情况之一。毕竟,它的设计考虑了字符串。所以:

select t
from (select t.*,
             count(*) over (partition by soundex(fname), soundex(lname), dob, sysemid) as cnt
      from t
     ) t
where cnt > 1
order by sysemid, dob, fname, lname;

答案 1 :(得分:1)

我猜你已经解决了新数据的问题,但对于旧数据你可以做的是以下内容:

1)进行精确比较,以获得非常精确的副本。这很容易。

2)对于类似的字符串,例如Josh和Joshh,你需要使用一些你需要编写的代码来检查两个字符串之间的距离,或者如果你喜欢在SQL中编码只是使用DIFFERENCE函数,那么更简单的方法。这将给你一个0-4的值,其中4表示字符串非常相似。关于这一点的坏处是你需要通过眼睛快速看看它们以确保一切都很好。有关详细信息https://technet.microsoft.com/en-us/library/ms189282(v=sql.105).aspx

3)我更喜欢你去,打开Visual Studio或你喜欢的IDE,连接你的数据库,选择表中的整个数据,把它带到内存中并实现一个好的字符串距离函数。

答案 2 :(得分:1)

像这样:

SELECT LEFT(FName,2) AS FN, LEFT(LName,2) AS LN, DOB, COUNT(*)
FROM YourTable
GROUP BY LEFT(FName,2), LEFT(LName,2), DOB
HAVING COUNT(*) > 1
;

答案 3 :(得分:0)

SQL Server中没有内置的灵丹妙药。您必须决定业务规则并对其进行编码。

例如,如果您决定在名称的前3个字母中查找匹配项,请使用LEFT()函数获取前3个字母。要查看DOB的各个部分,可以使用DATEPART()函数。