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