2013-02-26 69 views
5

我已经有两个表,成员和捐赠由会员ID链接。成员有很多重复。我想删除它们,但在此之前,我想将捐款中的会员条目更新为单个ID - 可能是Sara Tam情况下的MAX值(456)。SQL - 如何选择多行

有一个查询,选择所有Sara的成员(和其他人谁拥有项目的捐款,但不弗雷德谁不是呢?我怎么能联系起来的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 
+0

请发表您的表结构。另外,Sara的最大ID是789,对吗? – sgeddes 2013-02-26 01:51:24

+0

Sara与Fred共享她的一个会员ID(789)? – supergrady 2013-02-26 01:55:26

+0

Fred的ID应该是其他东西。 – hadenp 2013-02-26 02:09:14

回答

3

如果我正确理解你的问题,你想更新您的捐款表格与会员相关的MAX标识,并在保留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 Fiddle Demo

给你的意见,也许你只是在寻找的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; 

而且updated fiddle

+0

弗雷德的身份证应该是别的......抱歉。您能否重申这一点,以便查询只需选择要使用成员的最大ID更新的捐款记录? – hadenp 2013-02-26 02:21:54

+0

@hadenp - 我编辑了我的答案。祝你好运! – sgeddes 2013-02-26 02:33:55

+0

谢谢sgeddes - 在我实际进行更新之前,我想知道以下内容:对于所有捐款ID,会员中是否有多个ID?在我能够将萨拉的捐款ID更新至789之前,我需要知道她在会员身份中的所有ID,然后使用最大值更新捐款记录。 – hadenp 2013-02-26 03:04:42

0

尝试SELECT MEMBERS.* FROM MEMBERS, DONATIONS WHERE DONATIONS.ID != MEMBERS.ID它会给你所有有ID的成员没有捐款的行,我的语法可能有点偏离,但是可以参考有关连接的文档,例如informIT以获得更多信息

+0

他希望所有参与捐赠的成员以及所有其他ID。 – Barmar 2013-02-26 01:53:02

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 
+0

嗨巴尔马。我在会员中有重复的内容,并且一些捐款可能是根据真正属于会员中的一位成员的不同会员的ID编制的。我想知道的是,如果有任何捐款记录指出会员中有超过1条记录。 – hadenp 2013-02-26 02:49:29

+0

查看重复计数的更新查询。 – Barmar 2013-02-26 03:35:11