[AccessD] Merge records

jwcolby jwcolby at colbyconsulting.com
Tue May 29 06:51:59 CDT 2007


A.D.

When I removed the first * from the query the "SQL Check" stopped giving me
errors.  Apparently the syntax:

"DELETE * FROM tblData" 

Is invalid in SQL Server, whereas:

"DELETE FROM tblData"

is valid.

Now that I am beyond that stumbling block, let me test and get back to you.

Thanks for all of your help.

John W. Colby
Colby Consulting
www.ColbyConsulting.com 
-----Original Message-----
From: accessd-bounces at databaseadvisors.com
[mailto:accessd-bounces at databaseadvisors.com] On Behalf Of A.D.TEJPAL
Sent: Monday, May 28, 2007 3:03 PM
To: Access Developers discussion and problem solving
Cc: ADT
Subject: Re: [AccessD] Merge records

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
--
AccessD mailing list
AccessD at databaseadvisors.com
http://databaseadvisors.com/mailman/listinfo/accessd
Website: http://www.databaseadvisors.com




More information about the AccessD mailing list