我有一个包含两个表的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
答案 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)
备注
答案 1 :(得分:1)
听起来不一致的数据问题。
您需要拥有一个客户端的唯一ID,您可以在EventAttendance表中映射它以使其与1-m关系。由于您已经确定了clientid中重复记录之间的相似性,因此创建唯一ID不会成为问题。在客户端表中创建新列,并为同一客户端的每个重复客户端记录分配唯一编号。现在,您需要编写一个更新语句,您可以使用新的id更新EventAttendance表clientId列。这是一种方法。
更新后,您可以删除除第一个客户端以外的客户端的重复记录,并为其分配其唯一ID,并删除为识别一个客户端而在EventAttendance表中将其作为外键引用而创建的唯一ID列。
但我宁愿限制客户通过电子邮件地址创建重复的ID。