2013-02-26 11 views
5

メンバーIDとリンクされた2つのテーブル、メンバーと寄付があります。メンバーには多数の重複があります。私はそれらを削除したい、しかし私がする前に、私は寄付のメンバーのエントリを単一のIDに更新したいと思う - おそらくSara Tamの場合のMAX値(456)。SQL - 複数の行を選択する方法

は?どのように私は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

があなたのテーブル構造を投稿してください。また、サラの最大IDは789ですが、正しいですか? – sgeddes

+0

Saraはフレッドと彼女のメンバーID(789)のどちらかを共有していますか? – supergrady

+0

フレッドのIDは何か他のものでなければなりません。 – hadenp

答えて

3

私が正しくあなたの質問を理解していた場合、あなたはあなたの寄付テーブルがメンバーに関連付けられているMAX IDに更新すると、 MAXを保持しているメンバーテーブルの重複したレコードを削除します。

もしそうなら、これは動作するはずです - しかし、あなたは、同じIDを持つ2人を持つべきではありません。

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

は、おそらくあなただけを探している、あなたのコメントを与えます更新された寄付をMAX(Id)で表示する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; 

そしてupdated fiddle

+0

フレッドのIDは何か他のものになるはずです...ごめんなさい。あなたはこれを言い直すことができるので、クエリはメンバーの最大IDで更新しようとしている寄付のレコードを単に選択するでしょうか? – hadenp

+0

@hadenp - 私は自分の答えを編集しました。運が良かった! – sgeddes

+0

ありがとうございましたsgeddes - 私は実際に更新を行う前に、次のことを知りたいと思います:すべての寄付IDについて、メンバーに複数のIDがありますか?寄付のSaraのIDを789に更新する前に、メンバーのIDをすべて知ってから、maxを使ってDonationsの記録を更新する必要があります。 – hadenp

0

それは意志SELECT MEMBERS.* FROM MEMBERS, DONATIONS WHERE DONATIONS.ID != MEMBERS.IDを試してみてくださいサラのメンバーのすべて(および寄付のエントリを持って他の人ではなく、フレッドを選択することがクエリです私の構文は多少オフかもしれませんが、詳細についてはinformITからへの結合についてのドキュメントを参照してください。

+0

彼は寄付のすべてのメンバーだけでなく、他のすべてのIDを望んでいます。 – Barmar

0

これは、余分な重複IDすべての最大メンバーID:

寄付しているユーザーだけに、それを制限するために10
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

+0

重複をカウントする更新されたクエリを参照してください。 – Barmar

関連する問題