1

小さな診療所の患者情報を記録するために使用されるデータベースがあります。バックエンドとして 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 テーブルのすべてのフィールドを表示する必要があることです。

4

5 に答える 5

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
于 2013-11-13T10:07:37.340 に答える
0

私があなたの立場なら、次のようにします。

  1. FamilyName、FirstName、および DOB にインデックスを追加する
  2. サブクエリのビューを作成する
  3. クエリを次のように変更しました

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

于 2013-11-13T10:08:50.940 に答える
0

これにより、名と姓に基づいて、重複するすべての行が出力されます

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
于 2013-11-13T10:09:29.757 に答える
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
于 2013-11-13T10:55:20.757 に答える