SQL - 使用“IS LIKE”在2个表之间进行比较

时间:2012-07-10 23:18:49

标签: sql-server

好的,这会变得有点乱,所以请尽量和我在一起..

我有一张像这样的信息表...

Table Name: Customers
_____________________________
ID   | CompanyName | FirstName | LastName  | Phone
-------------------------------
1    | Joes        | Joe       | James     | 1233334444
2    | Kennys      | Kenny     | Johnson   | 2222334555
3    | Kellys      | Kelly     | Gibson    | 5454445445
4    | Ricks #1    | Rick      | Lawson    | 4545334222
5    | Johns #1    | Johny B   | James     | 4545222211
6    | Johns #2    | Johny     | James     | 4545222211
7    | Johns #3    | Johny     | James     | 4545222211
8    | Ricks #2    | Rick A    | Lawson    | 4545334222

我需要知道如何创建一个SQL语句,找到所有重复记录,添加它们,然后显示找到的第一个公司名称的重复记录总数。

* HERE的主题 - 从上表中可以看出,有时候他们会在姓名中加上他们的名字缩写(例如 - ID5和ID6是同一个人,但他把他的中间名字放在ID5中,你可以看到同样的ID4和ID7)

我需要SQL语句以首先匹配姓氏为基础进行比较,然后在名字和公司名称“物品”上做一个“IS LIKE”,以确保他们被计算在内是

例如 - 我应该得到类似于......的结果

Table Name: TableResults
_____________________________
ID   | CompanyName | FirstName | LastName  | Phone       | Count
-------------------------------
4    | Ricks #1    | Rick      | Lawson    | 4545334222  | 2
5    | Johns #1    | Johny B   | James     | 4545222211  | 3

这甚至可能吗?

2 个答案:

答案 0 :(得分:2)

我认为您可能需要使用模糊匹配。

试试这个:

WITH InitialData AS
(
  SELECT *, SOUNDEX(LastName) + SOUNDEX(CompanyName) Similarity 
    FROM Customers
), FinalData AS
(
  SELECT *, 
          ROW_NUMBER() OVER(PARTITION BY Similarity ORDER BY ID) Position,
          COUNT(1)  OVER(PARTITION BY Similarity) Count
  FROM InitialData
)
SELECT ID, CompanyName, FirstName, LastName, Phone, Count
  FROM FinalData
WHERE Position = 1
  AND Count > 1

SQLFiddle:http://sqlfiddle.com/#!3/7c1fb/2

答案 1 :(得分:0)

我认为名称分析将是一些非常复杂的SQL,如果可能的话。首先,您可能需要确保您的名称列使用Case- 不敏感排序规则,例如utf8_general_ci。我不相信人们会不断地将他们的名字大写。如果他们粗心大意,他们也可能有拼写错误。

除非您确切知道放置LIKE的位置,否则

%不够智能,无法匹配差异较小的字符串。它更像是一个通配符匹配函数。

也许使用SOUNDEX算法结账?但只有当您的所有数据都是英文时才会有效。

电话号码是否是识别重复项的可靠方法?如果是这样,您可以跳过名称分析,然后执行此操作:

SELECT ID, CompanyName, FirstName, LastName, Phone, COUNT(1) AS Count
FROM Customers 
GROUP BY Phone
ORDER BY ID ASC