2013-02-26 33 views
5

Iki tablo var, üye kimliği ile bağlanan Üyeler ve Bağışlar. Üyelerin çok sayıda kopyası var. Onları kaldırmak istiyorum, ama yapmadan önce, Bağışlar'daki bir üyenin girişlerini tek bir kimlikle - muhtemelen Sara Tam durumunda olan MAX değeri (456) - güncellemek istiyorum.SQL - Birden çok satır nasıl seçilir

o olacak SELECT MEMBERS.* FROM MEMBERS, DONATIONS WHERE DONATIONS.ID != MEMBERS.ID deneyin Sara'nın üyesinin tüm (ve Bağışlar girdilerine sahip ancak Fred değil kimin? Nasıl kimlikleri 123 ilişkilendirebilir ve 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

tablo yapılarını gönderin. Ayrıca Sara'nın maksimum kimliği 789, doğru mu? – sgeddes

+0

Sara, Üye ID'lerinden (789) birini Fred ile paylaşıyor? – supergrady

+0

Fred'in kimliği başka bir şey olmalı. Yazım hatası için üzgünüz. – hadenp

cevap

3

, bir Üyesi ilişkili MAX Id için Bağışlar tablosunu GÜNCELLENİR istiyorum ve MAX tablosundaki Üyeler tablosunda yinelenen kayıtları DELETE. böylece, o zaman bu çalışması gerekir Eğer

- ancak, aynı kimliğe sahip 2 Üyeler olmamalıdır:

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

yorumlarınızı verin, belki de sadece aradığınız Güncelleştirilmiş Bağışları MAX (Id) ile göstermek için SQL deyimi. Eğer öyleyse, o zaman bu çalışması gerekir:

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; 

Ve updated fiddle

+0

Fred'in kimliği başka bir şey olmalı ... üzgünüm. Sorgu, üye maksimum kimliği ile güncellenecek olan bağışlarda kayıtları seçmesi için bunu yeniden gönderebilir miydiniz? – hadenp

+0

@hadenp - Cevabımı düzenledim. iyi şanslar! – sgeddes

+0

Teşekkür ederim sgeddes - Güncellemeyi gerçekten yapmadan önce, aşağıdakileri öğrenmek istiyorum: Tüm bağış kimlikleri için Üyeler'de birden fazla kimlik var mı? Sara'nın ID'lerini 789'a güncellemeden önce, Üyelerindeki tüm kimliklerini bilmem gerekiyor, ardından Bağışlarda kayıtlarını güncellemek için maksimumu kullanmalıyım. – hadenp

0

diğerlerini seçmek için sorgu var mı Bağışta olmayan bir kimliği olan üyelerdeki tüm satırları verin. Sözdizimi biraz kapalı olabilir, ancak daha fazla bilgi için, bu parçadaki gibi informIT'dan itibaren eklere ilişkin belgelere bakın.

+0

Tüm üyelerin bağışlarda ve diğer tüm kimliklerinde olmasını ister. – Barmar

0

Tüm fazladan yinelenen kimlikler için maksimum üye kimliği:

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 

onu bağışlar vardır sadece kullanıcıların sınırlamak için: Doğru soruları anlamada olsam

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

Merhaba Barmar. Üyelerde çiftlerim var ve üyeler arasında gerçekten bir kişiye ait olan farklı bir üye kimliği altında bazı bağışlar yapılmış olabilir. Bilmek istediklerim, Üyelerde 1'den fazla kayda işaret eden herhangi bir bağış kaydı var mıdır. – hadenp

+0

Yinelenen sayılan güncel sorguya bakın. – Barmar

İlgili konular