SQL - 如何选择多行

5

我有两个表,成员和捐赠,它们由成员ID链接。成员表中存在许多重复项。我想要删除它们,但在此之前,我想将捐赠表中一个成员的条目更新为单个ID - 在Sara Tam的情况下可能是最大值(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

请发布您的表结构。此外,Sara的最大ID是789,对吗? - sgeddes
Sara与Fred分享了她的一个会员ID(789)吗? - supergrady
弗雷德的ID应该是其他的东西。抱歉打错了。 - hadenp
3个回答

3
如果我正确理解了您的问题,您想要更新您的捐赠表以与会员相关联的最大ID,并删除成员表中的重复记录并保留最大值。
如果是这样,那么这应该可以工作-但是,您不应该有两个具有相同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 Fiddle演示

请留下您的评论,也许您只是想要SQL语句来显示更新后的最大捐款。如果是这样,那么以下代码应该可以解决问题:

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;

And the updated fiddle


弗雷德的ID应该是其他的……抱歉。您能否重新陈述一下,使查询仅选择将要使用成员最大ID更新的捐赠记录? - hadenp
感谢sgeddes - 在我实际进行更新之前,我想知道以下内容:在Members中的所有捐赠ID中,是否存在多个ID?在我可以将Sara在捐赠中的ID更新为789之前,我需要知道她在Members中的所有ID,然后使用最大值来更新她在Donations中的记录。 - hadenp

0
尝试使用SELECT MEMBERS.* FROM MEMBERS, DONATIONS WHERE DONATIONS.ID != MEMBERS.ID,它将为您提供所有在成员中具有不在捐赠中的ID的行。我的语法可能有点问题,但是请参考关于连接的文档,例如informIT中的这篇文章,以获取更多信息。

他想要所有在捐赠中的成员,以及他们所有的其他ID。 - Barmar

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

嗨,Barmar。在成员中我有重复项,有些捐款可能是在一个成员的ID下进行的,但实际上属于另一个成员。我想知道的是是否存在任何指向成员中超过1条记录的捐赠记录。 - hadenp

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接