A.D.TEJPAL
adtp at hotmail.com
Mon May 28 14:03:13 CDT 2007
John,
Sample update query given below, will update fields F1 to F4 in table tblData. If any field is empty, it will get filled in by the first significant value occurring in any record for this field, for the given HashPerson. This query makes use of function Fn_MergedValue(), also given below.
After updating, duplicate records can be removed by running the sample delete query as given below.
For a large sized table with large number of fields, if serious slow down is experienced while running the update query, you could consider carrying out the update process for a few fields at a time
Best wishes,
A.D.Tejpal
---------------
Query for updating fields F1 to F4
(If the field is empty, first available value)
======================================
UPDATE tblData SET tblData.F1 = Fn_MergedValue("F1",[F1],[HashPerson]), tblData.F2 = Fn_MergedValue("F2",[F2],[HashPerson]), tblData.F3 = Fn_MergedValue("F3",[F3],[HashPerson]), tblData.F4 = Fn_MergedValue("F4",[F4],[HashPerson]);
======================================
Query for deleting duplicate HashPersons
======================================
DELETE * FROM tblData
WHERE (SELECT Count(*) FROM tblData As T1 WHERE T1.HashPerson = tblData.HashPerson AND T1.PKID <= tblData.PKID) > 1;
======================================
Fn_MergedValue() - User defined function
======================================
Function Fn_MergedValue( _
ByVal FieldName As String, _
ByVal FieldValue As Variant, _
ByVal HashPersonValue _
As String) As String
Dim Qst As String, Fdv As String
Dim rst As DAO.Recordset
Fdv = Nz(FieldValue, "")
' If field has significant value, retain it
If Len(Fdv) > 0 Then
GoTo ExitPoint
End If
' If field is empty, fill in the first significant value
' occuring in any record for this field, for the
' given HashPerson
Qst = "SELECT TOP 1 " & FieldName & _
" FROM tblData WHERE " & _
"HashPerson = '" & HashPersonValue & _
"' And Len(" & FieldName & ") > 0;"
Set rst = DBEngine(0)(0).OpenRecordset(Qst)
If rst.RecordCount > 0 Then
Fdv = Nz(rst.Fields(0), "")
End If
ExitPoint:
Fn_MergedValue = Fdv
On Error Resume Next
rst.Close
Set rst = Nothing
On Error GoTo 0
' Note - For repetitive use, DBEngine(0)(0)
' is preferred over CurrentDb
End Function
======================================
----- Original Message -----
From: jwcolby
To: 'Access Developers discussion and problem solving' ; dba-sqlserver at databaseadvisors.com
Sent: Sunday, May 27, 2007 23:25
Subject: [AccessD] Merge records
I have a situation where I might have several data records in a table (the
big 700 field table) that are about the same person / address but have
different data in some of the other fields. These records represent answers to surveys and so if a person answered three surveys, the person could have three records in the database. I need to merge the data from the three records into a single record, and eventually delete the other two.
I have developed a field that represents the SHA1 hash of the address, zip5, zip4, lastname and firstname. I am running some tests to see whether this hash is unique across 50 million records (unique to that name / address) but I suspect that it will be. Once I determine that it is, then I can use that single field as a single "person identifier" field.
So I need pointers how to "merge" the data from one record into a second record, only merging fields where there is legitimate data, and not overwriting fields where there is already data.
John W. Colby
Colby Consulting
www.ColbyConsulting.com