2013-02-26 3 views
5

У меня есть две таблицы, члены и пожертвования, связанные идентификатором участника. У членов есть много дубликатов. Я хочу удалить их, но прежде чем это сделать, я хочу обновить записи участников в пожертвованиях до одного ID - возможно, значение MAX (456) в случае Sara Tam.SQL - Как выбрать несколько строк

Есть ли запрос, чтобы выбрать все член Сары (и другие, которые имеют записи в пожертвованиях, но не Фред, кто не делает? Как я могу связать идентификаторы 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 Sara составляет 789, правильно? – sgeddes

+0

Сара делится одним из своих ID-адресов (789) с Фредом? – supergrady

+0

Идентификатор Фреда должен быть чем-то другим. Прошу прощения за опечатку. – hadenp

ответ

3

Если я понять ваши вопросы правильно, вы хотите обновить таблицу пожертвования на MAX Id, связанный с членом, и УДАЛИТЬ дублированные записи в таблице Members, сохраняя MAX.

Если это так, то это должно работать - однако, вы не должны иметь 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

Дайте ваши комментарии, возможно, вы ищете только для 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

+0

@hadenp - Я отредактировал свой ответ. удачи! – sgeddes

+0

Спасибо, sgeddes. Прежде чем я действительно сделаю обновление, я хотел бы знать следующее: для всех идентификаторов пожертвований есть несколько идентификаторов в членах? Прежде чем я смогу обновить идентификаторы Sara в пожертвованиях до 789, мне нужно знать все ее идентификаторы в странах-членах, а затем использовать max для обновления своих записей в Пожертвованиях. – hadenp

0

Попробуйте SELECT MEMBERS.* FROM MEMBERS, DONATIONS WHERE DONATIONS.ID != MEMBERS.ID это будет дайте вам все строки в членах, у которых есть идентификатор, который не пожертвован. Мой синтаксис может быть немного неактивным, но обратитесь к документации о объединениях, как этот фрагмент от informIT для получения дополнительной информации.

+0

Он хочет, чтобы все члены, которые _are_ пожертвования, а также все другие идентификаторы. – Barmar

0

Это найдет максимальный идентификатор участника для всех дополнительных дубликатов идентификаторов:

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

Привет, Бармар. У меня есть дубликаты в странах-членах, и некоторые пожертвования могли быть сделаны под идентификатором другого члена, который действительно принадлежит одному человеку в странах-членах. Я хотел бы знать, есть ли записи пожертвований, которые указывают на более чем 1 запись в странах-членах. – hadenp

+0

См. Обновленный запрос, который учитывает дубликаты. – Barmar

Смежные вопросы