5

我有两个表,成员和捐赠由成员 ID 链接。成员有许多重复项。我想删除它们,但在此之前,我想将 Donations 中的成员条目更新为单个 ID——在 Sara Tam 的情况下可能是 MAX 值 (456)。

是否有一个查询可以选择 Sara 的所有成员(以及其他在 Donations 中有条目但没有 Fred 的成员?我如何关联 ID 123 和 456?

   members          donations
    -----------     -----------
    123 Sara Tam        123   20.00   
    456 Sara Tam        123   40.00 
    789 Sara Tam        333   10.00
     .                  444   30.00 
     .                  999   30.00 
    789 Fred Foo
4

3 回答 3

3

如果我正确理解您的问题,您希望将 Donations 表更新为与成员关联的 MAX Id,并删除保留 MAX 的成员表中的重复记录。

如果是这样,那么这应该可以工作 - 但是,您不应该有 2 个具有相同 ID 的成员:

UPDATE Donations D
  JOIN Members M ON M.MemberId = D.MemberId
  JOIN (SELECT Max(MemberId) MaxId, Name
        FROM Members 
        GROUP BY Name
      ) M2 ON M.Name = M2.Name
SET D.MemberId = M2.MaxId;

DELETE M
FROM Members M
  JOIN Members M2 ON M.Name = M2.Name AND M.MemberId < M2.MemberId;

SQL 小提琴演示

发表您的意见,也许您只是在寻找 SQL 语句来显示更新后的捐款 MAX(Id)。如果是这样,那么这应该工作:

SELECT M2.MaxId MemberId, D.Amount
FROM Donations D
  JOIN Members M ON M.MemberId = D.MemberId
  JOIN (SELECT Max(MemberId) MaxId, Name
        FROM Members 
        GROUP BY Name
      ) M2 ON M.Name = M2.Name;

更新的小提琴

于 2013-02-26T02:02:56.343 回答
0

试试SELECT MEMBERS.* FROM MEMBERS, DONATIONS WHERE DONATIONS.ID != MEMBERS.ID吧,它会为您提供 ID 不在捐赠中的成员中的所有行。我的语法可能有点偏离,但请参阅有关联接的文档,例如informIT的这篇文章以获取更多信息。

于 2013-02-26T01:52:07.657 回答
0

这将找到所有额外重复 ID 的最大成员 ID:

select m1.member_id, max(m2.member_id) maxid
from members m1
join members m2 on m1.name = m2.name and m1.member_id < m2.member_id

要将其限制为仅捐赠的用户:

select m1.member_id, max(m2.member_id) maxid, count(*) duplicates
from members m1
join (select distinct member_id from donations) d on m1.member_id = d.member_id
join members m2 on m1.name = m2.name and m1.member_id < m2.member_id
having duplicates > 1
于 2013-02-26T01:58:41.457 回答