合并来自重复客户端记录的数据

时间:2011-06-10 20:29:57

标签: sql ms-access

我有一个包含两个表的Access数据库:client和eventAttendance。客户端在第一次注册时存储数据。 EventAttendance包含事件的ID,clientID以及客户端参加事件的日期。客户端表中存在重复记录。许多客户端都有多个clientID。这些clientID用于注册事件,因此相同的个人客户端可能已注册8个不同的事件,并且有8个不同的clientID。

我已在客户端表中识别出具有多个clientID的客户端,但我不确定如何合并eventAttendance表中的记录。任何人都可以推荐我应该如何处理这种情况?

表格客户端

ClientID  Name   Email
1         Jack   Jack@gmail.com
2         Jill   Jill@gmail.com
3         Jack   Jack@gmail.com

Table EventAttendance

EventID   ClientID   AttendanceDate
1         1          6/1/2000
1         3          6/1/2001

2 个答案:

答案 0 :(得分:1)

首先,我从MS-Access中删除了几年,所以我会尝试保留我的SQL Generic。我会考虑这个伪代码,其目的是传达实现删除欺骗客户端目标的步骤。

步骤1,更新事件出席表中的客户端ID以匹配重复客户端记录的最小ClientID

这里唯一的技巧是对所有客户端进行分组,并使用MIN聚合函数来确定每个客户端的最低ClientID。

UPDATE EventAttendance set ClientID = C2.ClientID
FROM
  EventAttendance as E
  INNER JOIN Clients as C1 on C1.ClientID = E.ClientID
  -- Re-Join with Clients to obtain the Minimum ClientID per Client
  INNER JOIN (Select Min(ClientID) as MinClientID FROM Clients GROUP BY ClientName) as C2 on C1.ClientName = C2.ClientName

步骤2,删除除每个客户的第一个客户记录

以外的所有记录

第1步清除了对欺骗客户的任何引用,因此我们可以自由删除欺骗。

DELETE FROM Clients 
WHERE ClientID not in 
  -- If the current record's ClientID is not in the following, then it is a dupe that is OK to be deleted
  (Select Min(ClientID) as MinClientID FROM Clients GROUP BY ClientName)

备注

  • 以上假设ClientName是每人唯一的。如果这不是一个好的字段,您可以尝试使用电子邮件地址或多个记录的串联来建立唯一性。
  • 将数据add a uniqueness constraint修复为客户名称或电子邮件地址(首选)列

答案 1 :(得分:1)

听起来不一致的数据问题。

您需要拥有一个客户端的唯一ID,您可以在EventAttendance表中映射它以使其与1-m关系。由于您已经确定了clientid中重复记录之间的相似性,因此创建唯一ID不会成为问题。在客户端表中创建新列,并为同一客户端的每个重复客户端记录分配唯一编号。现在,您需要编写一个更新语句,您可以使用新的id更新EventAttendance表clientId列。这是一种方法。

更新后,您可以删除除第一个客户端以外的客户端的重复记录,并为其分配其唯一ID,并删除为识别一个客户端而在EventAttendance表中将其作为外键引用而创建的唯一ID列。

但我宁愿限制客户通过电子邮件地址创建重复的ID。