使用T SQL列出重复的记录

时间:2013-11-13 09:59:45

标签: sql sql-server database sql-server-2008

我有一个数据库,用于记录小诊所的患者信息。我们使用MS SQL Server 2008作为后端。患者表包含以下列:

Id int identity(1,1), 
FamilyName varchar(30),
FirstName varchar (20), 
DOB datetime, 
AddressLine1 varchar (50), 
AddressLine2 varchar (50), 
State varchar (20), 
Postcode varchar (4), 
NextOfKin varchar (20), 
Homephone varchar (20), 
Mobile varchar (20)

有时,工作人员会注册一名新患者,并不知道患者已经在系统中有记录。我们最终得到了数千个重复的记录。

我想要做的是提供一份患者名单,这些患者在安静的时间内有重复的记录供员工合并。如果2条记录具有完全相同的FamilyName,FirstName和DOB,我们认为要复制2条记录。我目前正在做的是使用子查询返回记录如下:

SELECT FamilyName, 
       FirstName, 
       DOB, 
       AddressLine1, 
       AddressLine2, 
       State, 
       Postcode, 
       NextOfKin, 
       HomePhone,
       Mobile 
FROM
Patients AS p1 
WHERE Id IN 
          ( 
            SELECT Max(Id) 
            FROM Patients AS p2, 
            COUNT(id) AS NumberOfDuplicate 
            GROUP BY    
            FamilyName, 
            FirstName, 
            DOB HAVING COUNT(Id) > 1
          )

这会产生结果,但性能很糟糕。有没有更好的方法呢?唯一的要求是我需要显示Patients表中的所有字段,因为系统用户想要在决定是否合并记录之前查看所有细节。

5 个答案:

答案 0 :(得分:0)

我建议您在用于检测重复项的3个字段上构建索引, 然后尝试这个查询:

with Duplicates as
( 
    select FamilyName, FirstName, DOB
    from Patients 
    group by FamilyName, FirstName, DOB
    having count(*) > 1 
)
Select Patients.* 
from Patients 
    inner join Duplicates
    on Patients.FamilyName = Duplicates.FamilyName 
       And Patients.FirstName= Duplicates.FirstName
       and Patients.DOB= Duplicates.DOB

答案 1 :(得分:0)

如果我在你的鞋子里,我会这样做:

  1. 将索引添加到FamilyName,FirstName和DOB
  2. 为子查询创建视图
  3. 将查询修改为以下

    Select p.* FROM Patients p INNER JOIN view_name v ON v.FirstName=p.Firstname AND ...

答案 2 :(得分:0)

这将根据firstname和lastname

输出具有重复的每一行
SELECT DISTINCT t1.* 
FROM Table AS t1 
    INNER JOIN Table AS t2
    ON t1.firstname = t2.firstname 
       AND t1.lastname = t2.lastname
       AND t1.id <> t2.id

答案 3 :(得分:0)

WITH CTE 
AS
(
SELECT Id, FamilyName, FirstName ,DOB
ROW_NUMBER() OVER(PARTITION BY FamilyName, FirstName ,DOB ORDER BY Id) AS DuplicateCount
FROM PatientTable
)
select * from CTE where DuplicateCount > 1

答案 4 :(得分:0)

 select FamilyName, FirstName, DOB 
   from Patients 
  group by FamilyName, FirstName, DOB 
 having count(*)>1

将显示所有重复项。

但是,请考虑编写的名称不同,但类似。您可能希望查找主题“重复数据删除”和/或“记录链接”。我使用字符串相似度算法(修改过的Jaro / Winkler和levenshtein)解决了这个问题。