5

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

サラのすべてのメンバー(および寄付にエントリを持っているが、持っていないフレッドを持っていない他のメンバー)を選択するクエリはありますか?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

私があなたの質問を正しく理解しているなら、あなたはあなたの寄付テーブルをメンバーに関連付けられた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フィドルデモ

コメントを入力してください。おそらく、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;

そして更新されたフィドル

于 2013-02-26T02:02:56.343 に答える
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 に答える
0

試しSELECT MEMBERS.* FROM MEMBERS, DONATIONS WHERE DONATIONS.ID != MEMBERS.IDてみると、寄付に含まれていないIDを持つメンバーのすべての行が表示されます。私の構文は少しずれているかもしれませんが、詳細については、 informITのこの記事のように、結合に関するドキュメントを参照してください。

于 2013-02-26T01:52:07.657 に答える